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