162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * PS3 platform declarations. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2006 Sony Computer Entertainment Inc. 662306a36Sopenharmony_ci * Copyright 2006 Sony Corp. 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#if !defined(_ASM_POWERPC_PS3_H) 1062306a36Sopenharmony_ci#define _ASM_POWERPC_PS3_H 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/types.h> 1362306a36Sopenharmony_ci#include <linux/device.h> 1462306a36Sopenharmony_ci#include <asm/cell-pmu.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ciunion ps3_firmware_version { 1762306a36Sopenharmony_ci u64 raw; 1862306a36Sopenharmony_ci struct { 1962306a36Sopenharmony_ci u16 pad; 2062306a36Sopenharmony_ci u16 major; 2162306a36Sopenharmony_ci u16 minor; 2262306a36Sopenharmony_ci u16 rev; 2362306a36Sopenharmony_ci }; 2462306a36Sopenharmony_ci}; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_civoid ps3_get_firmware_version(union ps3_firmware_version *v); 2762306a36Sopenharmony_ciint ps3_compare_firmware_version(u16 major, u16 minor, u16 rev); 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci/* 'Other OS' area */ 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cienum ps3_param_av_multi_out { 3262306a36Sopenharmony_ci PS3_PARAM_AV_MULTI_OUT_NTSC = 0, 3362306a36Sopenharmony_ci PS3_PARAM_AV_MULTI_OUT_PAL_RGB = 1, 3462306a36Sopenharmony_ci PS3_PARAM_AV_MULTI_OUT_PAL_YCBCR = 2, 3562306a36Sopenharmony_ci PS3_PARAM_AV_MULTI_OUT_SECAM = 3, 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cienum ps3_param_av_multi_out ps3_os_area_get_av_multi_out(void); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ciextern u64 ps3_os_area_get_rtc_diff(void); 4162306a36Sopenharmony_ciextern void ps3_os_area_set_rtc_diff(u64 rtc_diff); 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistruct ps3_os_area_flash_ops { 4462306a36Sopenharmony_ci ssize_t (*read)(void *buf, size_t count, loff_t pos); 4562306a36Sopenharmony_ci ssize_t (*write)(const void *buf, size_t count, loff_t pos); 4662306a36Sopenharmony_ci}; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ciextern void ps3_os_area_flash_register(const struct ps3_os_area_flash_ops *ops); 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci/* dma routines */ 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cienum ps3_dma_page_size { 5362306a36Sopenharmony_ci PS3_DMA_4K = 12U, 5462306a36Sopenharmony_ci PS3_DMA_64K = 16U, 5562306a36Sopenharmony_ci PS3_DMA_1M = 20U, 5662306a36Sopenharmony_ci PS3_DMA_16M = 24U, 5762306a36Sopenharmony_ci}; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_cienum ps3_dma_region_type { 6062306a36Sopenharmony_ci PS3_DMA_OTHER = 0, 6162306a36Sopenharmony_ci PS3_DMA_INTERNAL = 2, 6262306a36Sopenharmony_ci}; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistruct ps3_dma_region_ops; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci/** 6762306a36Sopenharmony_ci * struct ps3_dma_region - A per device dma state variables structure 6862306a36Sopenharmony_ci * @did: The HV device id. 6962306a36Sopenharmony_ci * @page_size: The ioc pagesize. 7062306a36Sopenharmony_ci * @region_type: The HV region type. 7162306a36Sopenharmony_ci * @bus_addr: The 'translated' bus address of the region. 7262306a36Sopenharmony_ci * @len: The length in bytes of the region. 7362306a36Sopenharmony_ci * @offset: The offset from the start of memory of the region. 7462306a36Sopenharmony_ci * @dma_mask: Device dma_mask. 7562306a36Sopenharmony_ci * @ioid: The IOID of the device who owns this region 7662306a36Sopenharmony_ci * @chunk_list: Opaque variable used by the ioc page manager. 7762306a36Sopenharmony_ci * @region_ops: struct ps3_dma_region_ops - dma region operations 7862306a36Sopenharmony_ci */ 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cistruct ps3_dma_region { 8162306a36Sopenharmony_ci struct ps3_system_bus_device *dev; 8262306a36Sopenharmony_ci /* device variables */ 8362306a36Sopenharmony_ci const struct ps3_dma_region_ops *region_ops; 8462306a36Sopenharmony_ci unsigned char ioid; 8562306a36Sopenharmony_ci enum ps3_dma_page_size page_size; 8662306a36Sopenharmony_ci enum ps3_dma_region_type region_type; 8762306a36Sopenharmony_ci unsigned long len; 8862306a36Sopenharmony_ci unsigned long offset; 8962306a36Sopenharmony_ci u64 dma_mask; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci /* driver variables (set by ps3_dma_region_create) */ 9262306a36Sopenharmony_ci unsigned long bus_addr; 9362306a36Sopenharmony_ci struct { 9462306a36Sopenharmony_ci spinlock_t lock; 9562306a36Sopenharmony_ci struct list_head head; 9662306a36Sopenharmony_ci } chunk_list; 9762306a36Sopenharmony_ci}; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_cistruct ps3_dma_region_ops { 10062306a36Sopenharmony_ci int (*create)(struct ps3_dma_region *); 10162306a36Sopenharmony_ci int (*free)(struct ps3_dma_region *); 10262306a36Sopenharmony_ci int (*map)(struct ps3_dma_region *, 10362306a36Sopenharmony_ci unsigned long virt_addr, 10462306a36Sopenharmony_ci unsigned long len, 10562306a36Sopenharmony_ci dma_addr_t *bus_addr, 10662306a36Sopenharmony_ci u64 iopte_pp); 10762306a36Sopenharmony_ci int (*unmap)(struct ps3_dma_region *, 10862306a36Sopenharmony_ci dma_addr_t bus_addr, 10962306a36Sopenharmony_ci unsigned long len); 11062306a36Sopenharmony_ci}; 11162306a36Sopenharmony_ci/** 11262306a36Sopenharmony_ci * struct ps3_dma_region_init - Helper to initialize structure variables 11362306a36Sopenharmony_ci * 11462306a36Sopenharmony_ci * Helper to properly initialize variables prior to calling 11562306a36Sopenharmony_ci * ps3_system_bus_device_register. 11662306a36Sopenharmony_ci */ 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cistruct ps3_system_bus_device; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ciint ps3_dma_region_init(struct ps3_system_bus_device *dev, 12162306a36Sopenharmony_ci struct ps3_dma_region *r, enum ps3_dma_page_size page_size, 12262306a36Sopenharmony_ci enum ps3_dma_region_type region_type, void *addr, unsigned long len); 12362306a36Sopenharmony_ciint ps3_dma_region_create(struct ps3_dma_region *r); 12462306a36Sopenharmony_ciint ps3_dma_region_free(struct ps3_dma_region *r); 12562306a36Sopenharmony_ciint ps3_dma_map(struct ps3_dma_region *r, unsigned long virt_addr, 12662306a36Sopenharmony_ci unsigned long len, dma_addr_t *bus_addr, 12762306a36Sopenharmony_ci u64 iopte_pp); 12862306a36Sopenharmony_ciint ps3_dma_unmap(struct ps3_dma_region *r, dma_addr_t bus_addr, 12962306a36Sopenharmony_ci unsigned long len); 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci/* mmio routines */ 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cienum ps3_mmio_page_size { 13462306a36Sopenharmony_ci PS3_MMIO_4K = 12U, 13562306a36Sopenharmony_ci PS3_MMIO_64K = 16U 13662306a36Sopenharmony_ci}; 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_cistruct ps3_mmio_region_ops; 13962306a36Sopenharmony_ci/** 14062306a36Sopenharmony_ci * struct ps3_mmio_region - a per device mmio state variables structure 14162306a36Sopenharmony_ci * 14262306a36Sopenharmony_ci * Current systems can be supported with a single region per device. 14362306a36Sopenharmony_ci */ 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_cistruct ps3_mmio_region { 14662306a36Sopenharmony_ci struct ps3_system_bus_device *dev; 14762306a36Sopenharmony_ci const struct ps3_mmio_region_ops *mmio_ops; 14862306a36Sopenharmony_ci unsigned long bus_addr; 14962306a36Sopenharmony_ci unsigned long len; 15062306a36Sopenharmony_ci enum ps3_mmio_page_size page_size; 15162306a36Sopenharmony_ci unsigned long lpar_addr; 15262306a36Sopenharmony_ci}; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_cistruct ps3_mmio_region_ops { 15562306a36Sopenharmony_ci int (*create)(struct ps3_mmio_region *); 15662306a36Sopenharmony_ci int (*free)(struct ps3_mmio_region *); 15762306a36Sopenharmony_ci}; 15862306a36Sopenharmony_ci/** 15962306a36Sopenharmony_ci * struct ps3_mmio_region_init - Helper to initialize structure variables 16062306a36Sopenharmony_ci * 16162306a36Sopenharmony_ci * Helper to properly initialize variables prior to calling 16262306a36Sopenharmony_ci * ps3_system_bus_device_register. 16362306a36Sopenharmony_ci */ 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ciint ps3_mmio_region_init(struct ps3_system_bus_device *dev, 16662306a36Sopenharmony_ci struct ps3_mmio_region *r, unsigned long bus_addr, unsigned long len, 16762306a36Sopenharmony_ci enum ps3_mmio_page_size page_size); 16862306a36Sopenharmony_ciint ps3_mmio_region_create(struct ps3_mmio_region *r); 16962306a36Sopenharmony_ciint ps3_free_mmio_region(struct ps3_mmio_region *r); 17062306a36Sopenharmony_ciunsigned long ps3_mm_phys_to_lpar(unsigned long phys_addr); 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci/* inrerrupt routines */ 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_cienum ps3_cpu_binding { 17562306a36Sopenharmony_ci PS3_BINDING_CPU_ANY = -1, 17662306a36Sopenharmony_ci PS3_BINDING_CPU_0 = 0, 17762306a36Sopenharmony_ci PS3_BINDING_CPU_1 = 1, 17862306a36Sopenharmony_ci}; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ciint ps3_irq_plug_setup(enum ps3_cpu_binding cpu, unsigned long outlet, 18162306a36Sopenharmony_ci unsigned int *virq); 18262306a36Sopenharmony_ciint ps3_irq_plug_destroy(unsigned int virq); 18362306a36Sopenharmony_ciint ps3_event_receive_port_setup(enum ps3_cpu_binding cpu, unsigned int *virq); 18462306a36Sopenharmony_ciint ps3_event_receive_port_destroy(unsigned int virq); 18562306a36Sopenharmony_ciint ps3_send_event_locally(unsigned int virq); 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ciint ps3_io_irq_setup(enum ps3_cpu_binding cpu, unsigned int interrupt_id, 18862306a36Sopenharmony_ci unsigned int *virq); 18962306a36Sopenharmony_ciint ps3_io_irq_destroy(unsigned int virq); 19062306a36Sopenharmony_ciint ps3_vuart_irq_setup(enum ps3_cpu_binding cpu, void* virt_addr_bmp, 19162306a36Sopenharmony_ci unsigned int *virq); 19262306a36Sopenharmony_ciint ps3_vuart_irq_destroy(unsigned int virq); 19362306a36Sopenharmony_ciint ps3_spe_irq_setup(enum ps3_cpu_binding cpu, unsigned long spe_id, 19462306a36Sopenharmony_ci unsigned int class, unsigned int *virq); 19562306a36Sopenharmony_ciint ps3_spe_irq_destroy(unsigned int virq); 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ciint ps3_sb_event_receive_port_setup(struct ps3_system_bus_device *dev, 19862306a36Sopenharmony_ci enum ps3_cpu_binding cpu, unsigned int *virq); 19962306a36Sopenharmony_ciint ps3_sb_event_receive_port_destroy(struct ps3_system_bus_device *dev, 20062306a36Sopenharmony_ci unsigned int virq); 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci/* lv1 result codes */ 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_cienum lv1_result { 20562306a36Sopenharmony_ci LV1_SUCCESS = 0, 20662306a36Sopenharmony_ci /* not used -1 */ 20762306a36Sopenharmony_ci LV1_RESOURCE_SHORTAGE = -2, 20862306a36Sopenharmony_ci LV1_NO_PRIVILEGE = -3, 20962306a36Sopenharmony_ci LV1_DENIED_BY_POLICY = -4, 21062306a36Sopenharmony_ci LV1_ACCESS_VIOLATION = -5, 21162306a36Sopenharmony_ci LV1_NO_ENTRY = -6, 21262306a36Sopenharmony_ci LV1_DUPLICATE_ENTRY = -7, 21362306a36Sopenharmony_ci LV1_TYPE_MISMATCH = -8, 21462306a36Sopenharmony_ci LV1_BUSY = -9, 21562306a36Sopenharmony_ci LV1_EMPTY = -10, 21662306a36Sopenharmony_ci LV1_WRONG_STATE = -11, 21762306a36Sopenharmony_ci /* not used -12 */ 21862306a36Sopenharmony_ci LV1_NO_MATCH = -13, 21962306a36Sopenharmony_ci LV1_ALREADY_CONNECTED = -14, 22062306a36Sopenharmony_ci LV1_UNSUPPORTED_PARAMETER_VALUE = -15, 22162306a36Sopenharmony_ci LV1_CONDITION_NOT_SATISFIED = -16, 22262306a36Sopenharmony_ci LV1_ILLEGAL_PARAMETER_VALUE = -17, 22362306a36Sopenharmony_ci LV1_BAD_OPTION = -18, 22462306a36Sopenharmony_ci LV1_IMPLEMENTATION_LIMITATION = -19, 22562306a36Sopenharmony_ci LV1_NOT_IMPLEMENTED = -20, 22662306a36Sopenharmony_ci LV1_INVALID_CLASS_ID = -21, 22762306a36Sopenharmony_ci LV1_CONSTRAINT_NOT_SATISFIED = -22, 22862306a36Sopenharmony_ci LV1_ALIGNMENT_ERROR = -23, 22962306a36Sopenharmony_ci LV1_HARDWARE_ERROR = -24, 23062306a36Sopenharmony_ci LV1_INVALID_DATA_FORMAT = -25, 23162306a36Sopenharmony_ci LV1_INVALID_OPERATION = -26, 23262306a36Sopenharmony_ci LV1_INTERNAL_ERROR = -32768, 23362306a36Sopenharmony_ci}; 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_cistatic inline const char* ps3_result(int result) 23662306a36Sopenharmony_ci{ 23762306a36Sopenharmony_ci#if defined(DEBUG) || defined(PS3_VERBOSE_RESULT) || defined(CONFIG_PS3_VERBOSE_RESULT) 23862306a36Sopenharmony_ci switch (result) { 23962306a36Sopenharmony_ci case LV1_SUCCESS: 24062306a36Sopenharmony_ci return "LV1_SUCCESS (0)"; 24162306a36Sopenharmony_ci case -1: 24262306a36Sopenharmony_ci return "** unknown result ** (-1)"; 24362306a36Sopenharmony_ci case LV1_RESOURCE_SHORTAGE: 24462306a36Sopenharmony_ci return "LV1_RESOURCE_SHORTAGE (-2)"; 24562306a36Sopenharmony_ci case LV1_NO_PRIVILEGE: 24662306a36Sopenharmony_ci return "LV1_NO_PRIVILEGE (-3)"; 24762306a36Sopenharmony_ci case LV1_DENIED_BY_POLICY: 24862306a36Sopenharmony_ci return "LV1_DENIED_BY_POLICY (-4)"; 24962306a36Sopenharmony_ci case LV1_ACCESS_VIOLATION: 25062306a36Sopenharmony_ci return "LV1_ACCESS_VIOLATION (-5)"; 25162306a36Sopenharmony_ci case LV1_NO_ENTRY: 25262306a36Sopenharmony_ci return "LV1_NO_ENTRY (-6)"; 25362306a36Sopenharmony_ci case LV1_DUPLICATE_ENTRY: 25462306a36Sopenharmony_ci return "LV1_DUPLICATE_ENTRY (-7)"; 25562306a36Sopenharmony_ci case LV1_TYPE_MISMATCH: 25662306a36Sopenharmony_ci return "LV1_TYPE_MISMATCH (-8)"; 25762306a36Sopenharmony_ci case LV1_BUSY: 25862306a36Sopenharmony_ci return "LV1_BUSY (-9)"; 25962306a36Sopenharmony_ci case LV1_EMPTY: 26062306a36Sopenharmony_ci return "LV1_EMPTY (-10)"; 26162306a36Sopenharmony_ci case LV1_WRONG_STATE: 26262306a36Sopenharmony_ci return "LV1_WRONG_STATE (-11)"; 26362306a36Sopenharmony_ci case -12: 26462306a36Sopenharmony_ci return "** unknown result ** (-12)"; 26562306a36Sopenharmony_ci case LV1_NO_MATCH: 26662306a36Sopenharmony_ci return "LV1_NO_MATCH (-13)"; 26762306a36Sopenharmony_ci case LV1_ALREADY_CONNECTED: 26862306a36Sopenharmony_ci return "LV1_ALREADY_CONNECTED (-14)"; 26962306a36Sopenharmony_ci case LV1_UNSUPPORTED_PARAMETER_VALUE: 27062306a36Sopenharmony_ci return "LV1_UNSUPPORTED_PARAMETER_VALUE (-15)"; 27162306a36Sopenharmony_ci case LV1_CONDITION_NOT_SATISFIED: 27262306a36Sopenharmony_ci return "LV1_CONDITION_NOT_SATISFIED (-16)"; 27362306a36Sopenharmony_ci case LV1_ILLEGAL_PARAMETER_VALUE: 27462306a36Sopenharmony_ci return "LV1_ILLEGAL_PARAMETER_VALUE (-17)"; 27562306a36Sopenharmony_ci case LV1_BAD_OPTION: 27662306a36Sopenharmony_ci return "LV1_BAD_OPTION (-18)"; 27762306a36Sopenharmony_ci case LV1_IMPLEMENTATION_LIMITATION: 27862306a36Sopenharmony_ci return "LV1_IMPLEMENTATION_LIMITATION (-19)"; 27962306a36Sopenharmony_ci case LV1_NOT_IMPLEMENTED: 28062306a36Sopenharmony_ci return "LV1_NOT_IMPLEMENTED (-20)"; 28162306a36Sopenharmony_ci case LV1_INVALID_CLASS_ID: 28262306a36Sopenharmony_ci return "LV1_INVALID_CLASS_ID (-21)"; 28362306a36Sopenharmony_ci case LV1_CONSTRAINT_NOT_SATISFIED: 28462306a36Sopenharmony_ci return "LV1_CONSTRAINT_NOT_SATISFIED (-22)"; 28562306a36Sopenharmony_ci case LV1_ALIGNMENT_ERROR: 28662306a36Sopenharmony_ci return "LV1_ALIGNMENT_ERROR (-23)"; 28762306a36Sopenharmony_ci case LV1_HARDWARE_ERROR: 28862306a36Sopenharmony_ci return "LV1_HARDWARE_ERROR (-24)"; 28962306a36Sopenharmony_ci case LV1_INVALID_DATA_FORMAT: 29062306a36Sopenharmony_ci return "LV1_INVALID_DATA_FORMAT (-25)"; 29162306a36Sopenharmony_ci case LV1_INVALID_OPERATION: 29262306a36Sopenharmony_ci return "LV1_INVALID_OPERATION (-26)"; 29362306a36Sopenharmony_ci case LV1_INTERNAL_ERROR: 29462306a36Sopenharmony_ci return "LV1_INTERNAL_ERROR (-32768)"; 29562306a36Sopenharmony_ci default: 29662306a36Sopenharmony_ci BUG(); 29762306a36Sopenharmony_ci return "** unknown result **"; 29862306a36Sopenharmony_ci }; 29962306a36Sopenharmony_ci#else 30062306a36Sopenharmony_ci return ""; 30162306a36Sopenharmony_ci#endif 30262306a36Sopenharmony_ci} 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci/* system bus routines */ 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_cienum ps3_match_id { 30762306a36Sopenharmony_ci PS3_MATCH_ID_EHCI = 1, 30862306a36Sopenharmony_ci PS3_MATCH_ID_OHCI = 2, 30962306a36Sopenharmony_ci PS3_MATCH_ID_GELIC = 3, 31062306a36Sopenharmony_ci PS3_MATCH_ID_AV_SETTINGS = 4, 31162306a36Sopenharmony_ci PS3_MATCH_ID_SYSTEM_MANAGER = 5, 31262306a36Sopenharmony_ci PS3_MATCH_ID_STOR_DISK = 6, 31362306a36Sopenharmony_ci PS3_MATCH_ID_STOR_ROM = 7, 31462306a36Sopenharmony_ci PS3_MATCH_ID_STOR_FLASH = 8, 31562306a36Sopenharmony_ci PS3_MATCH_ID_SOUND = 9, 31662306a36Sopenharmony_ci PS3_MATCH_ID_GPU = 10, 31762306a36Sopenharmony_ci PS3_MATCH_ID_LPM = 11, 31862306a36Sopenharmony_ci}; 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_cienum ps3_match_sub_id { 32162306a36Sopenharmony_ci PS3_MATCH_SUB_ID_GPU_FB = 1, 32262306a36Sopenharmony_ci PS3_MATCH_SUB_ID_GPU_RAMDISK = 2, 32362306a36Sopenharmony_ci}; 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci#define PS3_MODULE_ALIAS_EHCI "ps3:1:0" 32662306a36Sopenharmony_ci#define PS3_MODULE_ALIAS_OHCI "ps3:2:0" 32762306a36Sopenharmony_ci#define PS3_MODULE_ALIAS_GELIC "ps3:3:0" 32862306a36Sopenharmony_ci#define PS3_MODULE_ALIAS_AV_SETTINGS "ps3:4:0" 32962306a36Sopenharmony_ci#define PS3_MODULE_ALIAS_SYSTEM_MANAGER "ps3:5:0" 33062306a36Sopenharmony_ci#define PS3_MODULE_ALIAS_STOR_DISK "ps3:6:0" 33162306a36Sopenharmony_ci#define PS3_MODULE_ALIAS_STOR_ROM "ps3:7:0" 33262306a36Sopenharmony_ci#define PS3_MODULE_ALIAS_STOR_FLASH "ps3:8:0" 33362306a36Sopenharmony_ci#define PS3_MODULE_ALIAS_SOUND "ps3:9:0" 33462306a36Sopenharmony_ci#define PS3_MODULE_ALIAS_GPU_FB "ps3:10:1" 33562306a36Sopenharmony_ci#define PS3_MODULE_ALIAS_GPU_RAMDISK "ps3:10:2" 33662306a36Sopenharmony_ci#define PS3_MODULE_ALIAS_LPM "ps3:11:0" 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_cienum ps3_system_bus_device_type { 33962306a36Sopenharmony_ci PS3_DEVICE_TYPE_IOC0 = 1, 34062306a36Sopenharmony_ci PS3_DEVICE_TYPE_SB, 34162306a36Sopenharmony_ci PS3_DEVICE_TYPE_VUART, 34262306a36Sopenharmony_ci PS3_DEVICE_TYPE_LPM, 34362306a36Sopenharmony_ci}; 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci/** 34662306a36Sopenharmony_ci * struct ps3_system_bus_device - a device on the system bus 34762306a36Sopenharmony_ci */ 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_cistruct ps3_system_bus_device { 35062306a36Sopenharmony_ci enum ps3_match_id match_id; 35162306a36Sopenharmony_ci enum ps3_match_sub_id match_sub_id; 35262306a36Sopenharmony_ci enum ps3_system_bus_device_type dev_type; 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci u64 bus_id; /* SB */ 35562306a36Sopenharmony_ci u64 dev_id; /* SB */ 35662306a36Sopenharmony_ci unsigned int interrupt_id; /* SB */ 35762306a36Sopenharmony_ci struct ps3_dma_region *d_region; /* SB, IOC0 */ 35862306a36Sopenharmony_ci struct ps3_mmio_region *m_region; /* SB, IOC0*/ 35962306a36Sopenharmony_ci unsigned int port_number; /* VUART */ 36062306a36Sopenharmony_ci struct { /* LPM */ 36162306a36Sopenharmony_ci u64 node_id; 36262306a36Sopenharmony_ci u64 pu_id; 36362306a36Sopenharmony_ci u64 rights; 36462306a36Sopenharmony_ci } lpm; 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci/* struct iommu_table *iommu_table; -- waiting for BenH's cleanups */ 36762306a36Sopenharmony_ci struct device core; 36862306a36Sopenharmony_ci void *driver_priv; /* private driver variables */ 36962306a36Sopenharmony_ci}; 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ciint ps3_open_hv_device(struct ps3_system_bus_device *dev); 37262306a36Sopenharmony_ciint ps3_close_hv_device(struct ps3_system_bus_device *dev); 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci/** 37562306a36Sopenharmony_ci * struct ps3_system_bus_driver - a driver for a device on the system bus 37662306a36Sopenharmony_ci */ 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_cistruct ps3_system_bus_driver { 37962306a36Sopenharmony_ci enum ps3_match_id match_id; 38062306a36Sopenharmony_ci enum ps3_match_sub_id match_sub_id; 38162306a36Sopenharmony_ci struct device_driver core; 38262306a36Sopenharmony_ci int (*probe)(struct ps3_system_bus_device *); 38362306a36Sopenharmony_ci void (*remove)(struct ps3_system_bus_device *); 38462306a36Sopenharmony_ci void (*shutdown)(struct ps3_system_bus_device *); 38562306a36Sopenharmony_ci/* int (*suspend)(struct ps3_system_bus_device *, pm_message_t); */ 38662306a36Sopenharmony_ci/* int (*resume)(struct ps3_system_bus_device *); */ 38762306a36Sopenharmony_ci}; 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ciint ps3_system_bus_device_register(struct ps3_system_bus_device *dev); 39062306a36Sopenharmony_ciint ps3_system_bus_driver_register(struct ps3_system_bus_driver *drv); 39162306a36Sopenharmony_civoid ps3_system_bus_driver_unregister(struct ps3_system_bus_driver *drv); 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_cistatic inline struct ps3_system_bus_driver *ps3_drv_to_system_bus_drv( 39462306a36Sopenharmony_ci struct device_driver *_drv) 39562306a36Sopenharmony_ci{ 39662306a36Sopenharmony_ci return container_of(_drv, struct ps3_system_bus_driver, core); 39762306a36Sopenharmony_ci} 39862306a36Sopenharmony_cistatic inline struct ps3_system_bus_device *ps3_dev_to_system_bus_dev( 39962306a36Sopenharmony_ci const struct device *_dev) 40062306a36Sopenharmony_ci{ 40162306a36Sopenharmony_ci return container_of(_dev, struct ps3_system_bus_device, core); 40262306a36Sopenharmony_ci} 40362306a36Sopenharmony_cistatic inline struct ps3_system_bus_driver * 40462306a36Sopenharmony_ci ps3_system_bus_dev_to_system_bus_drv(struct ps3_system_bus_device *_dev) 40562306a36Sopenharmony_ci{ 40662306a36Sopenharmony_ci BUG_ON(!_dev); 40762306a36Sopenharmony_ci BUG_ON(!_dev->core.driver); 40862306a36Sopenharmony_ci return ps3_drv_to_system_bus_drv(_dev->core.driver); 40962306a36Sopenharmony_ci} 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci/** 41262306a36Sopenharmony_ci * ps3_system_bus_set_drvdata - 41362306a36Sopenharmony_ci * @dev: device structure 41462306a36Sopenharmony_ci * @data: Data to set 41562306a36Sopenharmony_ci */ 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_cistatic inline void ps3_system_bus_set_drvdata( 41862306a36Sopenharmony_ci struct ps3_system_bus_device *dev, void *data) 41962306a36Sopenharmony_ci{ 42062306a36Sopenharmony_ci dev_set_drvdata(&dev->core, data); 42162306a36Sopenharmony_ci} 42262306a36Sopenharmony_cistatic inline void *ps3_system_bus_get_drvdata( 42362306a36Sopenharmony_ci struct ps3_system_bus_device *dev) 42462306a36Sopenharmony_ci{ 42562306a36Sopenharmony_ci return dev_get_drvdata(&dev->core); 42662306a36Sopenharmony_ci} 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci/* system manager */ 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_cistruct ps3_sys_manager_ops { 43162306a36Sopenharmony_ci struct ps3_system_bus_device *dev; 43262306a36Sopenharmony_ci void (*power_off)(struct ps3_system_bus_device *dev); 43362306a36Sopenharmony_ci void (*restart)(struct ps3_system_bus_device *dev); 43462306a36Sopenharmony_ci}; 43562306a36Sopenharmony_ci 43662306a36Sopenharmony_civoid ps3_sys_manager_register_ops(const struct ps3_sys_manager_ops *ops); 43762306a36Sopenharmony_civoid __noreturn ps3_sys_manager_power_off(void); 43862306a36Sopenharmony_civoid __noreturn ps3_sys_manager_restart(void); 43962306a36Sopenharmony_civoid __noreturn ps3_sys_manager_halt(void); 44062306a36Sopenharmony_ciint ps3_sys_manager_get_wol(void); 44162306a36Sopenharmony_civoid ps3_sys_manager_set_wol(int state); 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_cistruct ps3_prealloc { 44462306a36Sopenharmony_ci const char *name; 44562306a36Sopenharmony_ci void *address; 44662306a36Sopenharmony_ci unsigned long size; 44762306a36Sopenharmony_ci unsigned long align; 44862306a36Sopenharmony_ci}; 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_ciextern struct ps3_prealloc ps3fb_videomemory; 45162306a36Sopenharmony_ciextern struct ps3_prealloc ps3flash_bounce_buffer; 45262306a36Sopenharmony_ci 45362306a36Sopenharmony_ci/* logical performance monitor */ 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci/** 45662306a36Sopenharmony_ci * enum ps3_lpm_rights - Rigths granted by the system policy module. 45762306a36Sopenharmony_ci * 45862306a36Sopenharmony_ci * @PS3_LPM_RIGHTS_USE_LPM: The right to use the lpm. 45962306a36Sopenharmony_ci * @PS3_LPM_RIGHTS_USE_TB: The right to use the internal trace buffer. 46062306a36Sopenharmony_ci */ 46162306a36Sopenharmony_ci 46262306a36Sopenharmony_cienum ps3_lpm_rights { 46362306a36Sopenharmony_ci PS3_LPM_RIGHTS_USE_LPM = 0x001, 46462306a36Sopenharmony_ci PS3_LPM_RIGHTS_USE_TB = 0x100, 46562306a36Sopenharmony_ci}; 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_ci/** 46862306a36Sopenharmony_ci * enum ps3_lpm_tb_type - Type of trace buffer lv1 should use. 46962306a36Sopenharmony_ci * 47062306a36Sopenharmony_ci * @PS3_LPM_TB_TYPE_NONE: Do not use a trace buffer. 47162306a36Sopenharmony_ci * @PS3_LPM_RIGHTS_USE_TB: Use the lv1 internal trace buffer. Must have 47262306a36Sopenharmony_ci * rights @PS3_LPM_RIGHTS_USE_TB. 47362306a36Sopenharmony_ci */ 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_cienum ps3_lpm_tb_type { 47662306a36Sopenharmony_ci PS3_LPM_TB_TYPE_NONE = 0, 47762306a36Sopenharmony_ci PS3_LPM_TB_TYPE_INTERNAL = 1, 47862306a36Sopenharmony_ci}; 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ciint ps3_lpm_open(enum ps3_lpm_tb_type tb_type, void *tb_cache, 48162306a36Sopenharmony_ci u64 tb_cache_size); 48262306a36Sopenharmony_ciint ps3_lpm_close(void); 48362306a36Sopenharmony_ciint ps3_lpm_copy_tb(unsigned long offset, void *buf, unsigned long count, 48462306a36Sopenharmony_ci unsigned long *bytes_copied); 48562306a36Sopenharmony_ciint ps3_lpm_copy_tb_to_user(unsigned long offset, void __user *buf, 48662306a36Sopenharmony_ci unsigned long count, unsigned long *bytes_copied); 48762306a36Sopenharmony_civoid ps3_set_bookmark(u64 bookmark); 48862306a36Sopenharmony_civoid ps3_set_pm_bookmark(u64 tag, u64 incident, u64 th_id); 48962306a36Sopenharmony_ciint ps3_set_signal(u64 rtas_signal_group, u8 signal_bit, u16 sub_unit, 49062306a36Sopenharmony_ci u8 bus_word); 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_ciu32 ps3_read_phys_ctr(u32 cpu, u32 phys_ctr); 49362306a36Sopenharmony_civoid ps3_write_phys_ctr(u32 cpu, u32 phys_ctr, u32 val); 49462306a36Sopenharmony_ciu32 ps3_read_ctr(u32 cpu, u32 ctr); 49562306a36Sopenharmony_civoid ps3_write_ctr(u32 cpu, u32 ctr, u32 val); 49662306a36Sopenharmony_ci 49762306a36Sopenharmony_ciu32 ps3_read_pm07_control(u32 cpu, u32 ctr); 49862306a36Sopenharmony_civoid ps3_write_pm07_control(u32 cpu, u32 ctr, u32 val); 49962306a36Sopenharmony_ciu32 ps3_read_pm(u32 cpu, enum pm_reg_name reg); 50062306a36Sopenharmony_civoid ps3_write_pm(u32 cpu, enum pm_reg_name reg, u32 val); 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_ciu32 ps3_get_ctr_size(u32 cpu, u32 phys_ctr); 50362306a36Sopenharmony_civoid ps3_set_ctr_size(u32 cpu, u32 phys_ctr, u32 ctr_size); 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_civoid ps3_enable_pm(u32 cpu); 50662306a36Sopenharmony_civoid ps3_disable_pm(u32 cpu); 50762306a36Sopenharmony_civoid ps3_enable_pm_interrupts(u32 cpu, u32 thread, u32 mask); 50862306a36Sopenharmony_civoid ps3_disable_pm_interrupts(u32 cpu); 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_ciu32 ps3_get_and_clear_pm_interrupts(u32 cpu); 51162306a36Sopenharmony_civoid ps3_sync_irq(int node); 51262306a36Sopenharmony_ciu32 ps3_get_hw_thread_id(int cpu); 51362306a36Sopenharmony_ciu64 ps3_get_spe_id(void *arg); 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_civoid ps3_early_mm_init(void); 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_ci#endif 518