File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/x86_init.h

Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.

       1: #ifndef _ASM_X86_PLATFORM_H
       2: #define _ASM_X86_PLATFORM_H
       3: 
       4: #include <asm/pgtable_types.h>
       5: #include <asm/bootparam.h>
       6: 
       7: struct mpc_bus;
       8: struct mpc_cpu;
       9: struct mpc_table;
      10: struct cpuinfo_x86;
      11: 
      12: /**
      13:  * struct x86_init_mpparse - platform specific mpparse ops
      14:  * @mpc_record:            platform specific mpc record accounting
      15:  * @setup_ioapic_ids:        platform specific ioapic id override
      16:  * @mpc_apic_id:        platform specific mpc apic id assignment
      17:  * @smp_read_mpc_oem:        platform specific oem mpc table setup
      18:  * @mpc_oem_pci_bus:        platform specific pci bus setup (default NULL)
      19:  * @mpc_oem_bus_info:        platform specific mpc bus info
      20:  * @find_smp_config:        find the smp configuration
      21:  * @get_smp_config:        get the smp configuration
      22:  */
      23: struct x86_init_mpparse {
      24:     void (*mpc_record)(unsigned int mode);
      25:     void (*setup_ioapic_ids)(void);
      26:     int (*mpc_apic_id)(struct mpc_cpu *m);
      27:     void (*smp_read_mpc_oem)(struct mpc_table *mpc);
      28:     void (*mpc_oem_pci_bus)(struct mpc_bus *m);
      29:     void (*mpc_oem_bus_info)(struct mpc_bus *m, char *name);
      30:     void (*find_smp_config)(void);
      31:     void (*get_smp_config)(unsigned int early);
      32: };
      33: 
      34: /**
      35:  * struct x86_init_resources - platform specific resource related ops
      36:  * @probe_roms:            probe BIOS roms
      37:  * @reserve_resources:        reserve the standard resources for the
      38:  *                platform
      39:  * @memory_setup:        platform specific memory setup
      40:  *
      41:  */
      42: struct x86_init_resources {
      43:     void (*probe_roms)(void);
      44:     void (*reserve_resources)(void);
      45:     char *(*memory_setup)(void);
      46: };
      47: 
      48: /**
      49:  * struct x86_init_irqs - platform specific interrupt setup
      50:  * @pre_vector_init:        init code to run before interrupt vectors
      51:  *                are set up.
      52:  * @intr_init:            interrupt init code
      53:  * @trap_init:            platform specific trap setup
      54:  */
      55: struct x86_init_irqs {
      56:     void (*pre_vector_init)(void);
      57:     void (*intr_init)(void);
      58:     void (*trap_init)(void);
      59: };
      60: 
      61: /**
      62:  * struct x86_init_oem - oem platform specific customizing functions
      63:  * @arch_setup:            platform specific architecure setup
      64:  * @banner:            print a platform specific banner
      65:  */
      66: struct x86_init_oem {
      67:     void (*arch_setup)(void);
      68:     void (*banner)(void);
      69: };
      70: 
      71: /**
      72:  * struct x86_init_paging - platform specific paging functions
      73:  * @pagetable_init:    platform specific paging initialization call to setup
      74:  *            the kernel pagetables and prepare accessors functions.
      75:  *            Callback must call paging_init(). Called once after the
      76:  *            direct mapping for phys memory is available.
      77:  */
      78: struct x86_init_paging {
      79:     void (*pagetable_init)(void);
      80: };
      81: 
      82: /**
      83:  * struct x86_init_timers - platform specific timer setup
      84:  * @setup_perpcu_clockev:    set up the per cpu clock event device for the
      85:  *                boot cpu
      86:  * @tsc_pre_init:        platform function called before TSC init
      87:  * @timer_init:            initialize the platform timer (default PIT/HPET)
      88:  * @wallclock_init:        init the wallclock device
      89:  */
      90: struct x86_init_timers {
      91:     void (*setup_percpu_clockev)(void);
      92:     void (*tsc_pre_init)(void);
      93:     void (*timer_init)(void);
      94:     void (*wallclock_init)(void);
      95: };
      96: 
      97: /**
      98:  * struct x86_init_iommu - platform specific iommu setup
      99:  * @iommu_init:            platform specific iommu setup
     100:  */
     101: struct x86_init_iommu {
     102:     int (*iommu_init)(void);
     103: };
     104: 
     105: /**
     106:  * struct x86_init_pci - platform specific pci init functions
     107:  * @arch_init:            platform specific pci arch init call
     108:  * @init:            platform specific pci subsystem init
     109:  * @init_irq:            platform specific pci irq init
     110:  * @fixup_irqs:            platform specific pci irq fixup
     111:  */
     112: struct x86_init_pci {
     113:     int (*arch_init)(void);
     114:     int (*init)(void);
     115:     void (*init_irq)(void);
     116:     void (*fixup_irqs)(void);
     117: };
     118: 
     119: /**
     120:  * struct x86_init_ops - functions for platform specific setup
     121:  *
     122:  */
     123: struct x86_init_ops {
     124:     struct x86_init_resources    resources;
     125:     struct x86_init_mpparse        mpparse;
     126:     struct x86_init_irqs        irqs;
     127:     struct x86_init_oem        oem;
     128:     struct x86_init_paging        paging;
     129:     struct x86_init_timers        timers;
     130:     struct x86_init_iommu        iommu;
     131:     struct x86_init_pci        pci;
     132: };
     133: 
     134: /**
     135:  * struct x86_cpuinit_ops - platform specific cpu hotplug setups
     136:  * @setup_percpu_clockev:    set up the per cpu clock event device
     137:  * @early_percpu_clock_init:    early init of the per cpu clock event device
     138:  */
     139: struct x86_cpuinit_ops {
     140:     void (*setup_percpu_clockev)(void);
     141:     void (*early_percpu_clock_init)(void);
     142:     void (*fixup_cpu_id)(struct cpuinfo_x86 *c, int node);
     143: };
     144: 
     145: struct timespec;
     146: 
     147: /**
     148:  * struct x86_platform_ops - platform specific runtime functions
     149:  * @calibrate_tsc:        calibrate TSC
     150:  * @get_wallclock:        get time from HW clock like RTC etc.
     151:  * @set_wallclock:        set time back to HW clock
     152:  * @is_untracked_pat_range    exclude from PAT logic
     153:  * @nmi_init            enable NMI on cpus
     154:  * @i8042_detect        pre-detect if i8042 controller exists
     155:  * @save_sched_clock_state:    save state for sched_clock() on suspend
     156:  * @restore_sched_clock_state:    restore state for sched_clock() on resume
     157:  * @apic_post_init:        adjust apic if neeeded
     158:  */
     159: struct x86_platform_ops {
     160:     unsigned long (*calibrate_tsc)(void);
     161:     void (*get_wallclock)(struct timespec *ts);
     162:     int (*set_wallclock)(const struct timespec *ts);
     163:     void (*iommu_shutdown)(void);
     164:     bool (*is_untracked_pat_range)(u64 start, u64 end);
     165:     void (*nmi_init)(void);
     166:     unsigned char (*get_nmi_reason)(void);
     167:     int (*i8042_detect)(void);
     168:     void (*save_sched_clock_state)(void);
     169:     void (*restore_sched_clock_state)(void);
     170:     void (*apic_post_init)(void);
     171: };
     172: 
     173: struct pci_dev;
     174: struct msi_msg;
     175: struct msi_desc;
     176: 
     177: struct x86_msi_ops {
     178:     int (*setup_msi_irqs)(struct pci_dev *dev, int nvec, int type);
     179:     void (*compose_msi_msg)(struct pci_dev *dev, unsigned int irq,
     180:                 unsigned int dest, struct msi_msg *msg,
     181:                    u8 hpet_id);
     182:     void (*teardown_msi_irq)(unsigned int irq);
     183:     void (*teardown_msi_irqs)(struct pci_dev *dev);
     184:     void (*restore_msi_irqs)(struct pci_dev *dev, int irq);
     185:     int  (*setup_hpet_msi)(unsigned int irq, unsigned int id);
     186:     u32 (*msi_mask_irq)(struct msi_desc *desc, u32 mask, u32 flag);
     187:     u32 (*msix_mask_irq)(struct msi_desc *desc, u32 flag);
     188: };
     189: 
     190: struct IO_APIC_route_entry;
     191: struct io_apic_irq_attr;
     192: struct irq_data;
     193: struct cpumask;
     194: 
     195: struct x86_io_apic_ops {
     196:     void        (*init)   (void);
     197:     unsigned int    (*read)   (unsigned int apic, unsigned int reg);
     198:     void        (*write)  (unsigned int apic, unsigned int reg, unsigned int value);
     199:     void        (*modify) (unsigned int apic, unsigned int reg, unsigned int value);
     200:     void        (*disable)(void);
     201:     void        (*print_entries)(unsigned int apic, unsigned int nr_entries);
     202:     int        (*set_affinity)(struct irq_data *data,
     203:                     const struct cpumask *mask,
     204:                     bool force);
     205:     int        (*setup_entry)(int irq, struct IO_APIC_route_entry *entry,
     206:                        unsigned int destination, int vector,
     207:                        struct io_apic_irq_attr *attr);
     208:     void        (*eoi_ioapic_pin)(int apic, int pin, int vector);
     209: };
     210: 
     211: extern struct x86_init_ops x86_init;
     212: extern struct x86_cpuinit_ops x86_cpuinit;
     213: extern struct x86_platform_ops x86_platform;
     214: extern struct x86_msi_ops x86_msi;
     215: extern struct x86_io_apic_ops x86_io_apic_ops;
     216: extern void x86_init_noop(void);
     217: extern void x86_init_uint_noop(unsigned int unused);
     218: 
     219: #endif
     220: