cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

shpchp_hpc.c (27964B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * Standard PCI Hot Plug Driver
      4 *
      5 * Copyright (C) 1995,2001 Compaq Computer Corporation
      6 * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
      7 * Copyright (C) 2001 IBM Corp.
      8 * Copyright (C) 2003-2004 Intel Corporation
      9 *
     10 * All rights reserved.
     11 *
     12 * Send feedback to <greg@kroah.com>,<kristen.c.accardi@intel.com>
     13 *
     14 */
     15
     16#include <linux/kernel.h>
     17#include <linux/module.h>
     18#include <linux/types.h>
     19#include <linux/pci.h>
     20#include <linux/interrupt.h>
     21
     22#include "shpchp.h"
     23
     24/* Slot Available Register I field definition */
     25#define SLOT_33MHZ		0x0000001f
     26#define SLOT_66MHZ_PCIX		0x00001f00
     27#define SLOT_100MHZ_PCIX	0x001f0000
     28#define SLOT_133MHZ_PCIX	0x1f000000
     29
     30/* Slot Available Register II field definition */
     31#define SLOT_66MHZ		0x0000001f
     32#define SLOT_66MHZ_PCIX_266	0x00000f00
     33#define SLOT_100MHZ_PCIX_266	0x0000f000
     34#define SLOT_133MHZ_PCIX_266	0x000f0000
     35#define SLOT_66MHZ_PCIX_533	0x00f00000
     36#define SLOT_100MHZ_PCIX_533	0x0f000000
     37#define SLOT_133MHZ_PCIX_533	0xf0000000
     38
     39/* Slot Configuration */
     40#define SLOT_NUM		0x0000001F
     41#define	FIRST_DEV_NUM		0x00001F00
     42#define PSN			0x07FF0000
     43#define	UPDOWN			0x20000000
     44#define	MRLSENSOR		0x40000000
     45#define ATTN_BUTTON		0x80000000
     46
     47/*
     48 * Interrupt Locator Register definitions
     49 */
     50#define CMD_INTR_PENDING	(1 << 0)
     51#define SLOT_INTR_PENDING(i)	(1 << (i + 1))
     52
     53/*
     54 * Controller SERR-INT Register
     55 */
     56#define GLOBAL_INTR_MASK	(1 << 0)
     57#define GLOBAL_SERR_MASK	(1 << 1)
     58#define COMMAND_INTR_MASK	(1 << 2)
     59#define ARBITER_SERR_MASK	(1 << 3)
     60#define COMMAND_DETECTED	(1 << 16)
     61#define ARBITER_DETECTED	(1 << 17)
     62#define SERR_INTR_RSVDZ_MASK	0xfffc0000
     63
     64/*
     65 * Logical Slot Register definitions
     66 */
     67#define SLOT_REG(i)		(SLOT1 + (4 * i))
     68
     69#define SLOT_STATE_SHIFT	(0)
     70#define SLOT_STATE_MASK		(3 << 0)
     71#define SLOT_STATE_PWRONLY	(1)
     72#define SLOT_STATE_ENABLED	(2)
     73#define SLOT_STATE_DISABLED	(3)
     74#define PWR_LED_STATE_SHIFT	(2)
     75#define PWR_LED_STATE_MASK	(3 << 2)
     76#define ATN_LED_STATE_SHIFT	(4)
     77#define ATN_LED_STATE_MASK	(3 << 4)
     78#define ATN_LED_STATE_ON	(1)
     79#define ATN_LED_STATE_BLINK	(2)
     80#define ATN_LED_STATE_OFF	(3)
     81#define POWER_FAULT		(1 << 6)
     82#define ATN_BUTTON		(1 << 7)
     83#define MRL_SENSOR		(1 << 8)
     84#define MHZ66_CAP		(1 << 9)
     85#define PRSNT_SHIFT		(10)
     86#define PRSNT_MASK		(3 << 10)
     87#define PCIX_CAP_SHIFT		(12)
     88#define PCIX_CAP_MASK_PI1	(3 << 12)
     89#define PCIX_CAP_MASK_PI2	(7 << 12)
     90#define PRSNT_CHANGE_DETECTED	(1 << 16)
     91#define ISO_PFAULT_DETECTED	(1 << 17)
     92#define BUTTON_PRESS_DETECTED	(1 << 18)
     93#define MRL_CHANGE_DETECTED	(1 << 19)
     94#define CON_PFAULT_DETECTED	(1 << 20)
     95#define PRSNT_CHANGE_INTR_MASK	(1 << 24)
     96#define ISO_PFAULT_INTR_MASK	(1 << 25)
     97#define BUTTON_PRESS_INTR_MASK	(1 << 26)
     98#define MRL_CHANGE_INTR_MASK	(1 << 27)
     99#define CON_PFAULT_INTR_MASK	(1 << 28)
    100#define MRL_CHANGE_SERR_MASK	(1 << 29)
    101#define CON_PFAULT_SERR_MASK	(1 << 30)
    102#define SLOT_REG_RSVDZ_MASK	((1 << 15) | (7 << 21))
    103
    104/*
    105 * SHPC Command Code definitions
    106 *
    107 *     Slot Operation				00h - 3Fh
    108 *     Set Bus Segment Speed/Mode A		40h - 47h
    109 *     Power-Only All Slots			48h
    110 *     Enable All Slots				49h
    111 *     Set Bus Segment Speed/Mode B (PI=2)	50h - 5Fh
    112 *     Reserved Command Codes			60h - BFh
    113 *     Vendor Specific Commands			C0h - FFh
    114 */
    115#define SET_SLOT_PWR		0x01	/* Slot Operation */
    116#define SET_SLOT_ENABLE		0x02
    117#define SET_SLOT_DISABLE	0x03
    118#define SET_PWR_ON		0x04
    119#define SET_PWR_BLINK		0x08
    120#define SET_PWR_OFF		0x0c
    121#define SET_ATTN_ON		0x10
    122#define SET_ATTN_BLINK		0x20
    123#define SET_ATTN_OFF		0x30
    124#define SETA_PCI_33MHZ		0x40	/* Set Bus Segment Speed/Mode A */
    125#define SETA_PCI_66MHZ		0x41
    126#define SETA_PCIX_66MHZ		0x42
    127#define SETA_PCIX_100MHZ	0x43
    128#define SETA_PCIX_133MHZ	0x44
    129#define SETA_RESERVED1		0x45
    130#define SETA_RESERVED2		0x46
    131#define SETA_RESERVED3		0x47
    132#define SET_PWR_ONLY_ALL	0x48	/* Power-Only All Slots */
    133#define SET_ENABLE_ALL		0x49	/* Enable All Slots */
    134#define	SETB_PCI_33MHZ		0x50	/* Set Bus Segment Speed/Mode B */
    135#define SETB_PCI_66MHZ		0x51
    136#define SETB_PCIX_66MHZ_PM	0x52
    137#define SETB_PCIX_100MHZ_PM	0x53
    138#define SETB_PCIX_133MHZ_PM	0x54
    139#define SETB_PCIX_66MHZ_EM	0x55
    140#define SETB_PCIX_100MHZ_EM	0x56
    141#define SETB_PCIX_133MHZ_EM	0x57
    142#define SETB_PCIX_66MHZ_266	0x58
    143#define SETB_PCIX_100MHZ_266	0x59
    144#define SETB_PCIX_133MHZ_266	0x5a
    145#define SETB_PCIX_66MHZ_533	0x5b
    146#define SETB_PCIX_100MHZ_533	0x5c
    147#define SETB_PCIX_133MHZ_533	0x5d
    148#define SETB_RESERVED1		0x5e
    149#define SETB_RESERVED2		0x5f
    150
    151/*
    152 * SHPC controller command error code
    153 */
    154#define SWITCH_OPEN		0x1
    155#define INVALID_CMD		0x2
    156#define INVALID_SPEED_MODE	0x4
    157
    158/*
    159 * For accessing SHPC Working Register Set via PCI Configuration Space
    160 */
    161#define DWORD_SELECT		0x2
    162#define DWORD_DATA		0x4
    163
    164/* Field Offset in Logical Slot Register - byte boundary */
    165#define SLOT_EVENT_LATCH	0x2
    166#define SLOT_SERR_INT_MASK	0x3
    167
    168static irqreturn_t shpc_isr(int irq, void *dev_id);
    169static void start_int_poll_timer(struct controller *ctrl, int sec);
    170static int hpc_check_cmd_status(struct controller *ctrl);
    171
    172static inline u8 shpc_readb(struct controller *ctrl, int reg)
    173{
    174	return readb(ctrl->creg + reg);
    175}
    176
    177static inline u16 shpc_readw(struct controller *ctrl, int reg)
    178{
    179	return readw(ctrl->creg + reg);
    180}
    181
    182static inline void shpc_writew(struct controller *ctrl, int reg, u16 val)
    183{
    184	writew(val, ctrl->creg + reg);
    185}
    186
    187static inline u32 shpc_readl(struct controller *ctrl, int reg)
    188{
    189	return readl(ctrl->creg + reg);
    190}
    191
    192static inline void shpc_writel(struct controller *ctrl, int reg, u32 val)
    193{
    194	writel(val, ctrl->creg + reg);
    195}
    196
    197static inline int shpc_indirect_read(struct controller *ctrl, int index,
    198				     u32 *value)
    199{
    200	int rc;
    201	u32 cap_offset = ctrl->cap_offset;
    202	struct pci_dev *pdev = ctrl->pci_dev;
    203
    204	rc = pci_write_config_byte(pdev, cap_offset + DWORD_SELECT, index);
    205	if (rc)
    206		return rc;
    207	return pci_read_config_dword(pdev, cap_offset + DWORD_DATA, value);
    208}
    209
    210/*
    211 * This is the interrupt polling timeout function.
    212 */
    213static void int_poll_timeout(struct timer_list *t)
    214{
    215	struct controller *ctrl = from_timer(ctrl, t, poll_timer);
    216
    217	/* Poll for interrupt events.  regs == NULL => polling */
    218	shpc_isr(0, ctrl);
    219
    220	if (!shpchp_poll_time)
    221		shpchp_poll_time = 2; /* default polling interval is 2 sec */
    222
    223	start_int_poll_timer(ctrl, shpchp_poll_time);
    224}
    225
    226/*
    227 * This function starts the interrupt polling timer.
    228 */
    229static void start_int_poll_timer(struct controller *ctrl, int sec)
    230{
    231	/* Clamp to sane value */
    232	if ((sec <= 0) || (sec > 60))
    233		sec = 2;
    234
    235	ctrl->poll_timer.expires = jiffies + sec * HZ;
    236	add_timer(&ctrl->poll_timer);
    237}
    238
    239static inline int is_ctrl_busy(struct controller *ctrl)
    240{
    241	u16 cmd_status = shpc_readw(ctrl, CMD_STATUS);
    242	return cmd_status & 0x1;
    243}
    244
    245/*
    246 * Returns 1 if SHPC finishes executing a command within 1 sec,
    247 * otherwise returns 0.
    248 */
    249static inline int shpc_poll_ctrl_busy(struct controller *ctrl)
    250{
    251	int i;
    252
    253	if (!is_ctrl_busy(ctrl))
    254		return 1;
    255
    256	/* Check every 0.1 sec for a total of 1 sec */
    257	for (i = 0; i < 10; i++) {
    258		msleep(100);
    259		if (!is_ctrl_busy(ctrl))
    260			return 1;
    261	}
    262
    263	return 0;
    264}
    265
    266static inline int shpc_wait_cmd(struct controller *ctrl)
    267{
    268	int retval = 0;
    269	unsigned long timeout = msecs_to_jiffies(1000);
    270	int rc;
    271
    272	if (shpchp_poll_mode)
    273		rc = shpc_poll_ctrl_busy(ctrl);
    274	else
    275		rc = wait_event_interruptible_timeout(ctrl->queue,
    276						!is_ctrl_busy(ctrl), timeout);
    277	if (!rc && is_ctrl_busy(ctrl)) {
    278		retval = -EIO;
    279		ctrl_err(ctrl, "Command not completed in 1000 msec\n");
    280	} else if (rc < 0) {
    281		retval = -EINTR;
    282		ctrl_info(ctrl, "Command was interrupted by a signal\n");
    283	}
    284
    285	return retval;
    286}
    287
    288static int shpc_write_cmd(struct slot *slot, u8 t_slot, u8 cmd)
    289{
    290	struct controller *ctrl = slot->ctrl;
    291	u16 cmd_status;
    292	int retval = 0;
    293	u16 temp_word;
    294
    295	mutex_lock(&slot->ctrl->cmd_lock);
    296
    297	if (!shpc_poll_ctrl_busy(ctrl)) {
    298		/* After 1 sec and the controller is still busy */
    299		ctrl_err(ctrl, "Controller is still busy after 1 sec\n");
    300		retval = -EBUSY;
    301		goto out;
    302	}
    303
    304	++t_slot;
    305	temp_word =  (t_slot << 8) | (cmd & 0xFF);
    306	ctrl_dbg(ctrl, "%s: t_slot %x cmd %x\n", __func__, t_slot, cmd);
    307
    308	/* To make sure the Controller Busy bit is 0 before we send out the
    309	 * command.
    310	 */
    311	shpc_writew(ctrl, CMD, temp_word);
    312
    313	/*
    314	 * Wait for command completion.
    315	 */
    316	retval = shpc_wait_cmd(slot->ctrl);
    317	if (retval)
    318		goto out;
    319
    320	cmd_status = hpc_check_cmd_status(slot->ctrl);
    321	if (cmd_status) {
    322		ctrl_err(ctrl, "Failed to issued command 0x%x (error code = %d)\n",
    323			 cmd, cmd_status);
    324		retval = -EIO;
    325	}
    326 out:
    327	mutex_unlock(&slot->ctrl->cmd_lock);
    328	return retval;
    329}
    330
    331static int hpc_check_cmd_status(struct controller *ctrl)
    332{
    333	int retval = 0;
    334	u16 cmd_status = shpc_readw(ctrl, CMD_STATUS) & 0x000F;
    335
    336	switch (cmd_status >> 1) {
    337	case 0:
    338		retval = 0;
    339		break;
    340	case 1:
    341		retval = SWITCH_OPEN;
    342		ctrl_err(ctrl, "Switch opened!\n");
    343		break;
    344	case 2:
    345		retval = INVALID_CMD;
    346		ctrl_err(ctrl, "Invalid HPC command!\n");
    347		break;
    348	case 4:
    349		retval = INVALID_SPEED_MODE;
    350		ctrl_err(ctrl, "Invalid bus speed/mode!\n");
    351		break;
    352	default:
    353		retval = cmd_status;
    354	}
    355
    356	return retval;
    357}
    358
    359
    360static int hpc_get_attention_status(struct slot *slot, u8 *status)
    361{
    362	struct controller *ctrl = slot->ctrl;
    363	u32 slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot));
    364	u8 state = (slot_reg & ATN_LED_STATE_MASK) >> ATN_LED_STATE_SHIFT;
    365
    366	switch (state) {
    367	case ATN_LED_STATE_ON:
    368		*status = 1;	/* On */
    369		break;
    370	case ATN_LED_STATE_BLINK:
    371		*status = 2;	/* Blink */
    372		break;
    373	case ATN_LED_STATE_OFF:
    374		*status = 0;	/* Off */
    375		break;
    376	default:
    377		*status = 0xFF;	/* Reserved */
    378		break;
    379	}
    380
    381	return 0;
    382}
    383
    384static int hpc_get_power_status(struct slot *slot, u8 *status)
    385{
    386	struct controller *ctrl = slot->ctrl;
    387	u32 slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot));
    388	u8 state = (slot_reg & SLOT_STATE_MASK) >> SLOT_STATE_SHIFT;
    389
    390	switch (state) {
    391	case SLOT_STATE_PWRONLY:
    392		*status = 2;	/* Powered only */
    393		break;
    394	case SLOT_STATE_ENABLED:
    395		*status = 1;	/* Enabled */
    396		break;
    397	case SLOT_STATE_DISABLED:
    398		*status = 0;	/* Disabled */
    399		break;
    400	default:
    401		*status = 0xFF;	/* Reserved */
    402		break;
    403	}
    404
    405	return 0;
    406}
    407
    408
    409static int hpc_get_latch_status(struct slot *slot, u8 *status)
    410{
    411	struct controller *ctrl = slot->ctrl;
    412	u32 slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot));
    413
    414	*status = !!(slot_reg & MRL_SENSOR);	/* 0 -> close; 1 -> open */
    415
    416	return 0;
    417}
    418
    419static int hpc_get_adapter_status(struct slot *slot, u8 *status)
    420{
    421	struct controller *ctrl = slot->ctrl;
    422	u32 slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot));
    423	u8 state = (slot_reg & PRSNT_MASK) >> PRSNT_SHIFT;
    424
    425	*status = (state != 0x3) ? 1 : 0;
    426
    427	return 0;
    428}
    429
    430static int hpc_get_prog_int(struct slot *slot, u8 *prog_int)
    431{
    432	struct controller *ctrl = slot->ctrl;
    433
    434	*prog_int = shpc_readb(ctrl, PROG_INTERFACE);
    435
    436	return 0;
    437}
    438
    439static int hpc_get_adapter_speed(struct slot *slot, enum pci_bus_speed *value)
    440{
    441	int retval = 0;
    442	struct controller *ctrl = slot->ctrl;
    443	u32 slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot));
    444	u8 m66_cap  = !!(slot_reg & MHZ66_CAP);
    445	u8 pi, pcix_cap;
    446
    447	retval = hpc_get_prog_int(slot, &pi);
    448	if (retval)
    449		return retval;
    450
    451	switch (pi) {
    452	case 1:
    453		pcix_cap = (slot_reg & PCIX_CAP_MASK_PI1) >> PCIX_CAP_SHIFT;
    454		break;
    455	case 2:
    456		pcix_cap = (slot_reg & PCIX_CAP_MASK_PI2) >> PCIX_CAP_SHIFT;
    457		break;
    458	default:
    459		return -ENODEV;
    460	}
    461
    462	ctrl_dbg(ctrl, "%s: slot_reg = %x, pcix_cap = %x, m66_cap = %x\n",
    463		 __func__, slot_reg, pcix_cap, m66_cap);
    464
    465	switch (pcix_cap) {
    466	case 0x0:
    467		*value = m66_cap ? PCI_SPEED_66MHz : PCI_SPEED_33MHz;
    468		break;
    469	case 0x1:
    470		*value = PCI_SPEED_66MHz_PCIX;
    471		break;
    472	case 0x3:
    473		*value = PCI_SPEED_133MHz_PCIX;
    474		break;
    475	case 0x4:
    476		*value = PCI_SPEED_133MHz_PCIX_266;
    477		break;
    478	case 0x5:
    479		*value = PCI_SPEED_133MHz_PCIX_533;
    480		break;
    481	case 0x2:
    482	default:
    483		*value = PCI_SPEED_UNKNOWN;
    484		retval = -ENODEV;
    485		break;
    486	}
    487
    488	ctrl_dbg(ctrl, "Adapter speed = %d\n", *value);
    489	return retval;
    490}
    491
    492static int hpc_get_mode1_ECC_cap(struct slot *slot, u8 *mode)
    493{
    494	int retval = 0;
    495	struct controller *ctrl = slot->ctrl;
    496	u16 sec_bus_status = shpc_readw(ctrl, SEC_BUS_CONFIG);
    497	u8 pi = shpc_readb(ctrl, PROG_INTERFACE);
    498
    499	if (pi == 2) {
    500		*mode = (sec_bus_status & 0x0100) >> 8;
    501	} else {
    502		retval = -1;
    503	}
    504
    505	ctrl_dbg(ctrl, "Mode 1 ECC cap = %d\n", *mode);
    506	return retval;
    507}
    508
    509static int hpc_query_power_fault(struct slot *slot)
    510{
    511	struct controller *ctrl = slot->ctrl;
    512	u32 slot_reg = shpc_readl(ctrl, SLOT_REG(slot->hp_slot));
    513
    514	/* Note: Logic 0 => fault */
    515	return !(slot_reg & POWER_FAULT);
    516}
    517
    518static int hpc_set_attention_status(struct slot *slot, u8 value)
    519{
    520	u8 slot_cmd = 0;
    521
    522	switch (value) {
    523		case 0:
    524			slot_cmd = SET_ATTN_OFF;	/* OFF */
    525			break;
    526		case 1:
    527			slot_cmd = SET_ATTN_ON;		/* ON */
    528			break;
    529		case 2:
    530			slot_cmd = SET_ATTN_BLINK;	/* BLINK */
    531			break;
    532		default:
    533			return -1;
    534	}
    535
    536	return shpc_write_cmd(slot, slot->hp_slot, slot_cmd);
    537}
    538
    539
    540static void hpc_set_green_led_on(struct slot *slot)
    541{
    542	shpc_write_cmd(slot, slot->hp_slot, SET_PWR_ON);
    543}
    544
    545static void hpc_set_green_led_off(struct slot *slot)
    546{
    547	shpc_write_cmd(slot, slot->hp_slot, SET_PWR_OFF);
    548}
    549
    550static void hpc_set_green_led_blink(struct slot *slot)
    551{
    552	shpc_write_cmd(slot, slot->hp_slot, SET_PWR_BLINK);
    553}
    554
    555static void hpc_release_ctlr(struct controller *ctrl)
    556{
    557	int i;
    558	u32 slot_reg, serr_int;
    559
    560	/*
    561	 * Mask event interrupts and SERRs of all slots
    562	 */
    563	for (i = 0; i < ctrl->num_slots; i++) {
    564		slot_reg = shpc_readl(ctrl, SLOT_REG(i));
    565		slot_reg |= (PRSNT_CHANGE_INTR_MASK | ISO_PFAULT_INTR_MASK |
    566			     BUTTON_PRESS_INTR_MASK | MRL_CHANGE_INTR_MASK |
    567			     CON_PFAULT_INTR_MASK   | MRL_CHANGE_SERR_MASK |
    568			     CON_PFAULT_SERR_MASK);
    569		slot_reg &= ~SLOT_REG_RSVDZ_MASK;
    570		shpc_writel(ctrl, SLOT_REG(i), slot_reg);
    571	}
    572
    573	cleanup_slots(ctrl);
    574
    575	/*
    576	 * Mask SERR and System Interrupt generation
    577	 */
    578	serr_int = shpc_readl(ctrl, SERR_INTR_ENABLE);
    579	serr_int |= (GLOBAL_INTR_MASK  | GLOBAL_SERR_MASK |
    580		     COMMAND_INTR_MASK | ARBITER_SERR_MASK);
    581	serr_int &= ~SERR_INTR_RSVDZ_MASK;
    582	shpc_writel(ctrl, SERR_INTR_ENABLE, serr_int);
    583
    584	if (shpchp_poll_mode)
    585		del_timer(&ctrl->poll_timer);
    586	else {
    587		free_irq(ctrl->pci_dev->irq, ctrl);
    588		pci_disable_msi(ctrl->pci_dev);
    589	}
    590
    591	iounmap(ctrl->creg);
    592	release_mem_region(ctrl->mmio_base, ctrl->mmio_size);
    593}
    594
    595static int hpc_power_on_slot(struct slot *slot)
    596{
    597	int retval;
    598
    599	retval = shpc_write_cmd(slot, slot->hp_slot, SET_SLOT_PWR);
    600	if (retval)
    601		ctrl_err(slot->ctrl, "%s: Write command failed!\n", __func__);
    602
    603	return retval;
    604}
    605
    606static int hpc_slot_enable(struct slot *slot)
    607{
    608	int retval;
    609
    610	/* Slot - Enable, Power Indicator - Blink, Attention Indicator - Off */
    611	retval = shpc_write_cmd(slot, slot->hp_slot,
    612			SET_SLOT_ENABLE | SET_PWR_BLINK | SET_ATTN_OFF);
    613	if (retval)
    614		ctrl_err(slot->ctrl, "%s: Write command failed!\n", __func__);
    615
    616	return retval;
    617}
    618
    619static int hpc_slot_disable(struct slot *slot)
    620{
    621	int retval;
    622
    623	/* Slot - Disable, Power Indicator - Off, Attention Indicator - On */
    624	retval = shpc_write_cmd(slot, slot->hp_slot,
    625			SET_SLOT_DISABLE | SET_PWR_OFF | SET_ATTN_ON);
    626	if (retval)
    627		ctrl_err(slot->ctrl, "%s: Write command failed!\n", __func__);
    628
    629	return retval;
    630}
    631
    632static int shpc_get_cur_bus_speed(struct controller *ctrl)
    633{
    634	int retval = 0;
    635	struct pci_bus *bus = ctrl->pci_dev->subordinate;
    636	enum pci_bus_speed bus_speed = PCI_SPEED_UNKNOWN;
    637	u16 sec_bus_reg = shpc_readw(ctrl, SEC_BUS_CONFIG);
    638	u8 pi = shpc_readb(ctrl, PROG_INTERFACE);
    639	u8 speed_mode = (pi == 2) ? (sec_bus_reg & 0xF) : (sec_bus_reg & 0x7);
    640
    641	if ((pi == 1) && (speed_mode > 4)) {
    642		retval = -ENODEV;
    643		goto out;
    644	}
    645
    646	switch (speed_mode) {
    647	case 0x0:
    648		bus_speed = PCI_SPEED_33MHz;
    649		break;
    650	case 0x1:
    651		bus_speed = PCI_SPEED_66MHz;
    652		break;
    653	case 0x2:
    654		bus_speed = PCI_SPEED_66MHz_PCIX;
    655		break;
    656	case 0x3:
    657		bus_speed = PCI_SPEED_100MHz_PCIX;
    658		break;
    659	case 0x4:
    660		bus_speed = PCI_SPEED_133MHz_PCIX;
    661		break;
    662	case 0x5:
    663		bus_speed = PCI_SPEED_66MHz_PCIX_ECC;
    664		break;
    665	case 0x6:
    666		bus_speed = PCI_SPEED_100MHz_PCIX_ECC;
    667		break;
    668	case 0x7:
    669		bus_speed = PCI_SPEED_133MHz_PCIX_ECC;
    670		break;
    671	case 0x8:
    672		bus_speed = PCI_SPEED_66MHz_PCIX_266;
    673		break;
    674	case 0x9:
    675		bus_speed = PCI_SPEED_100MHz_PCIX_266;
    676		break;
    677	case 0xa:
    678		bus_speed = PCI_SPEED_133MHz_PCIX_266;
    679		break;
    680	case 0xb:
    681		bus_speed = PCI_SPEED_66MHz_PCIX_533;
    682		break;
    683	case 0xc:
    684		bus_speed = PCI_SPEED_100MHz_PCIX_533;
    685		break;
    686	case 0xd:
    687		bus_speed = PCI_SPEED_133MHz_PCIX_533;
    688		break;
    689	default:
    690		retval = -ENODEV;
    691		break;
    692	}
    693
    694 out:
    695	bus->cur_bus_speed = bus_speed;
    696	dbg("Current bus speed = %d\n", bus_speed);
    697	return retval;
    698}
    699
    700
    701static int hpc_set_bus_speed_mode(struct slot *slot, enum pci_bus_speed value)
    702{
    703	int retval;
    704	struct controller *ctrl = slot->ctrl;
    705	u8 pi, cmd;
    706
    707	pi = shpc_readb(ctrl, PROG_INTERFACE);
    708	if ((pi == 1) && (value > PCI_SPEED_133MHz_PCIX))
    709		return -EINVAL;
    710
    711	switch (value) {
    712	case PCI_SPEED_33MHz:
    713		cmd = SETA_PCI_33MHZ;
    714		break;
    715	case PCI_SPEED_66MHz:
    716		cmd = SETA_PCI_66MHZ;
    717		break;
    718	case PCI_SPEED_66MHz_PCIX:
    719		cmd = SETA_PCIX_66MHZ;
    720		break;
    721	case PCI_SPEED_100MHz_PCIX:
    722		cmd = SETA_PCIX_100MHZ;
    723		break;
    724	case PCI_SPEED_133MHz_PCIX:
    725		cmd = SETA_PCIX_133MHZ;
    726		break;
    727	case PCI_SPEED_66MHz_PCIX_ECC:
    728		cmd = SETB_PCIX_66MHZ_EM;
    729		break;
    730	case PCI_SPEED_100MHz_PCIX_ECC:
    731		cmd = SETB_PCIX_100MHZ_EM;
    732		break;
    733	case PCI_SPEED_133MHz_PCIX_ECC:
    734		cmd = SETB_PCIX_133MHZ_EM;
    735		break;
    736	case PCI_SPEED_66MHz_PCIX_266:
    737		cmd = SETB_PCIX_66MHZ_266;
    738		break;
    739	case PCI_SPEED_100MHz_PCIX_266:
    740		cmd = SETB_PCIX_100MHZ_266;
    741		break;
    742	case PCI_SPEED_133MHz_PCIX_266:
    743		cmd = SETB_PCIX_133MHZ_266;
    744		break;
    745	case PCI_SPEED_66MHz_PCIX_533:
    746		cmd = SETB_PCIX_66MHZ_533;
    747		break;
    748	case PCI_SPEED_100MHz_PCIX_533:
    749		cmd = SETB_PCIX_100MHZ_533;
    750		break;
    751	case PCI_SPEED_133MHz_PCIX_533:
    752		cmd = SETB_PCIX_133MHZ_533;
    753		break;
    754	default:
    755		return -EINVAL;
    756	}
    757
    758	retval = shpc_write_cmd(slot, 0, cmd);
    759	if (retval)
    760		ctrl_err(ctrl, "%s: Write command failed!\n", __func__);
    761	else
    762		shpc_get_cur_bus_speed(ctrl);
    763
    764	return retval;
    765}
    766
    767static irqreturn_t shpc_isr(int irq, void *dev_id)
    768{
    769	struct controller *ctrl = (struct controller *)dev_id;
    770	u32 serr_int, slot_reg, intr_loc, intr_loc2;
    771	int hp_slot;
    772
    773	/* Check to see if it was our interrupt */
    774	intr_loc = shpc_readl(ctrl, INTR_LOC);
    775	if (!intr_loc)
    776		return IRQ_NONE;
    777
    778	ctrl_dbg(ctrl, "%s: intr_loc = %x\n", __func__, intr_loc);
    779
    780	if (!shpchp_poll_mode) {
    781		/*
    782		 * Mask Global Interrupt Mask - see implementation
    783		 * note on p. 139 of SHPC spec rev 1.0
    784		 */
    785		serr_int = shpc_readl(ctrl, SERR_INTR_ENABLE);
    786		serr_int |= GLOBAL_INTR_MASK;
    787		serr_int &= ~SERR_INTR_RSVDZ_MASK;
    788		shpc_writel(ctrl, SERR_INTR_ENABLE, serr_int);
    789
    790		intr_loc2 = shpc_readl(ctrl, INTR_LOC);
    791		ctrl_dbg(ctrl, "%s: intr_loc2 = %x\n", __func__, intr_loc2);
    792	}
    793
    794	if (intr_loc & CMD_INTR_PENDING) {
    795		/*
    796		 * Command Complete Interrupt Pending
    797		 * RO only - clear by writing 1 to the Command Completion
    798		 * Detect bit in Controller SERR-INT register
    799		 */
    800		serr_int = shpc_readl(ctrl, SERR_INTR_ENABLE);
    801		serr_int &= ~SERR_INTR_RSVDZ_MASK;
    802		shpc_writel(ctrl, SERR_INTR_ENABLE, serr_int);
    803
    804		wake_up_interruptible(&ctrl->queue);
    805	}
    806
    807	if (!(intr_loc & ~CMD_INTR_PENDING))
    808		goto out;
    809
    810	for (hp_slot = 0; hp_slot < ctrl->num_slots; hp_slot++) {
    811		/* To find out which slot has interrupt pending */
    812		if (!(intr_loc & SLOT_INTR_PENDING(hp_slot)))
    813			continue;
    814
    815		slot_reg = shpc_readl(ctrl, SLOT_REG(hp_slot));
    816		ctrl_dbg(ctrl, "Slot %x with intr, slot register = %x\n",
    817			 hp_slot, slot_reg);
    818
    819		if (slot_reg & MRL_CHANGE_DETECTED)
    820			shpchp_handle_switch_change(hp_slot, ctrl);
    821
    822		if (slot_reg & BUTTON_PRESS_DETECTED)
    823			shpchp_handle_attention_button(hp_slot, ctrl);
    824
    825		if (slot_reg & PRSNT_CHANGE_DETECTED)
    826			shpchp_handle_presence_change(hp_slot, ctrl);
    827
    828		if (slot_reg & (ISO_PFAULT_DETECTED | CON_PFAULT_DETECTED))
    829			shpchp_handle_power_fault(hp_slot, ctrl);
    830
    831		/* Clear all slot events */
    832		slot_reg &= ~SLOT_REG_RSVDZ_MASK;
    833		shpc_writel(ctrl, SLOT_REG(hp_slot), slot_reg);
    834	}
    835 out:
    836	if (!shpchp_poll_mode) {
    837		/* Unmask Global Interrupt Mask */
    838		serr_int = shpc_readl(ctrl, SERR_INTR_ENABLE);
    839		serr_int &= ~(GLOBAL_INTR_MASK | SERR_INTR_RSVDZ_MASK);
    840		shpc_writel(ctrl, SERR_INTR_ENABLE, serr_int);
    841	}
    842
    843	return IRQ_HANDLED;
    844}
    845
    846static int shpc_get_max_bus_speed(struct controller *ctrl)
    847{
    848	int retval = 0;
    849	struct pci_bus *bus = ctrl->pci_dev->subordinate;
    850	enum pci_bus_speed bus_speed = PCI_SPEED_UNKNOWN;
    851	u8 pi = shpc_readb(ctrl, PROG_INTERFACE);
    852	u32 slot_avail1 = shpc_readl(ctrl, SLOT_AVAIL1);
    853	u32 slot_avail2 = shpc_readl(ctrl, SLOT_AVAIL2);
    854
    855	if (pi == 2) {
    856		if (slot_avail2 & SLOT_133MHZ_PCIX_533)
    857			bus_speed = PCI_SPEED_133MHz_PCIX_533;
    858		else if (slot_avail2 & SLOT_100MHZ_PCIX_533)
    859			bus_speed = PCI_SPEED_100MHz_PCIX_533;
    860		else if (slot_avail2 & SLOT_66MHZ_PCIX_533)
    861			bus_speed = PCI_SPEED_66MHz_PCIX_533;
    862		else if (slot_avail2 & SLOT_133MHZ_PCIX_266)
    863			bus_speed = PCI_SPEED_133MHz_PCIX_266;
    864		else if (slot_avail2 & SLOT_100MHZ_PCIX_266)
    865			bus_speed = PCI_SPEED_100MHz_PCIX_266;
    866		else if (slot_avail2 & SLOT_66MHZ_PCIX_266)
    867			bus_speed = PCI_SPEED_66MHz_PCIX_266;
    868	}
    869
    870	if (bus_speed == PCI_SPEED_UNKNOWN) {
    871		if (slot_avail1 & SLOT_133MHZ_PCIX)
    872			bus_speed = PCI_SPEED_133MHz_PCIX;
    873		else if (slot_avail1 & SLOT_100MHZ_PCIX)
    874			bus_speed = PCI_SPEED_100MHz_PCIX;
    875		else if (slot_avail1 & SLOT_66MHZ_PCIX)
    876			bus_speed = PCI_SPEED_66MHz_PCIX;
    877		else if (slot_avail2 & SLOT_66MHZ)
    878			bus_speed = PCI_SPEED_66MHz;
    879		else if (slot_avail1 & SLOT_33MHZ)
    880			bus_speed = PCI_SPEED_33MHz;
    881		else
    882			retval = -ENODEV;
    883	}
    884
    885	bus->max_bus_speed = bus_speed;
    886	ctrl_dbg(ctrl, "Max bus speed = %d\n", bus_speed);
    887
    888	return retval;
    889}
    890
    891static const struct hpc_ops shpchp_hpc_ops = {
    892	.power_on_slot			= hpc_power_on_slot,
    893	.slot_enable			= hpc_slot_enable,
    894	.slot_disable			= hpc_slot_disable,
    895	.set_bus_speed_mode		= hpc_set_bus_speed_mode,
    896	.set_attention_status	= hpc_set_attention_status,
    897	.get_power_status		= hpc_get_power_status,
    898	.get_attention_status	= hpc_get_attention_status,
    899	.get_latch_status		= hpc_get_latch_status,
    900	.get_adapter_status		= hpc_get_adapter_status,
    901
    902	.get_adapter_speed		= hpc_get_adapter_speed,
    903	.get_mode1_ECC_cap		= hpc_get_mode1_ECC_cap,
    904	.get_prog_int			= hpc_get_prog_int,
    905
    906	.query_power_fault		= hpc_query_power_fault,
    907	.green_led_on			= hpc_set_green_led_on,
    908	.green_led_off			= hpc_set_green_led_off,
    909	.green_led_blink		= hpc_set_green_led_blink,
    910
    911	.release_ctlr			= hpc_release_ctlr,
    912};
    913
    914int shpc_init(struct controller *ctrl, struct pci_dev *pdev)
    915{
    916	int rc = -1, num_slots = 0;
    917	u8 hp_slot;
    918	u32 shpc_base_offset;
    919	u32 tempdword, slot_reg, slot_config;
    920	u8 i;
    921
    922	ctrl->pci_dev = pdev;  /* pci_dev of the P2P bridge */
    923	ctrl_dbg(ctrl, "Hotplug Controller:\n");
    924
    925	if (pdev->vendor == PCI_VENDOR_ID_AMD &&
    926	    pdev->device == PCI_DEVICE_ID_AMD_GOLAM_7450) {
    927		/* amd shpc driver doesn't use Base Offset; assume 0 */
    928		ctrl->mmio_base = pci_resource_start(pdev, 0);
    929		ctrl->mmio_size = pci_resource_len(pdev, 0);
    930	} else {
    931		ctrl->cap_offset = pci_find_capability(pdev, PCI_CAP_ID_SHPC);
    932		if (!ctrl->cap_offset) {
    933			ctrl_err(ctrl, "Cannot find PCI capability\n");
    934			goto abort;
    935		}
    936		ctrl_dbg(ctrl, " cap_offset = %x\n", ctrl->cap_offset);
    937
    938		rc = shpc_indirect_read(ctrl, 0, &shpc_base_offset);
    939		if (rc) {
    940			ctrl_err(ctrl, "Cannot read base_offset\n");
    941			goto abort;
    942		}
    943
    944		rc = shpc_indirect_read(ctrl, 3, &tempdword);
    945		if (rc) {
    946			ctrl_err(ctrl, "Cannot read slot config\n");
    947			goto abort;
    948		}
    949		num_slots = tempdword & SLOT_NUM;
    950		ctrl_dbg(ctrl, " num_slots (indirect) %x\n", num_slots);
    951
    952		for (i = 0; i < 9 + num_slots; i++) {
    953			rc = shpc_indirect_read(ctrl, i, &tempdword);
    954			if (rc) {
    955				ctrl_err(ctrl, "Cannot read creg (index = %d)\n",
    956					 i);
    957				goto abort;
    958			}
    959			ctrl_dbg(ctrl, " offset %d: value %x\n", i, tempdword);
    960		}
    961
    962		ctrl->mmio_base =
    963			pci_resource_start(pdev, 0) + shpc_base_offset;
    964		ctrl->mmio_size = 0x24 + 0x4 * num_slots;
    965	}
    966
    967	ctrl_info(ctrl, "HPC vendor_id %x device_id %x ss_vid %x ss_did %x\n",
    968		  pdev->vendor, pdev->device, pdev->subsystem_vendor,
    969		  pdev->subsystem_device);
    970
    971	rc = pci_enable_device(pdev);
    972	if (rc) {
    973		ctrl_err(ctrl, "pci_enable_device failed\n");
    974		goto abort;
    975	}
    976
    977	if (!request_mem_region(ctrl->mmio_base, ctrl->mmio_size, MY_NAME)) {
    978		ctrl_err(ctrl, "Cannot reserve MMIO region\n");
    979		rc = -1;
    980		goto abort;
    981	}
    982
    983	ctrl->creg = ioremap(ctrl->mmio_base, ctrl->mmio_size);
    984	if (!ctrl->creg) {
    985		ctrl_err(ctrl, "Cannot remap MMIO region %lx @ %lx\n",
    986			 ctrl->mmio_size, ctrl->mmio_base);
    987		release_mem_region(ctrl->mmio_base, ctrl->mmio_size);
    988		rc = -1;
    989		goto abort;
    990	}
    991	ctrl_dbg(ctrl, "ctrl->creg %p\n", ctrl->creg);
    992
    993	mutex_init(&ctrl->crit_sect);
    994	mutex_init(&ctrl->cmd_lock);
    995
    996	/* Setup wait queue */
    997	init_waitqueue_head(&ctrl->queue);
    998
    999	ctrl->hpc_ops = &shpchp_hpc_ops;
   1000
   1001	/* Return PCI Controller Info */
   1002	slot_config = shpc_readl(ctrl, SLOT_CONFIG);
   1003	ctrl->slot_device_offset = (slot_config & FIRST_DEV_NUM) >> 8;
   1004	ctrl->num_slots = slot_config & SLOT_NUM;
   1005	ctrl->first_slot = (slot_config & PSN) >> 16;
   1006	ctrl->slot_num_inc = ((slot_config & UPDOWN) >> 29) ? 1 : -1;
   1007
   1008	/* Mask Global Interrupt Mask & Command Complete Interrupt Mask */
   1009	tempdword = shpc_readl(ctrl, SERR_INTR_ENABLE);
   1010	ctrl_dbg(ctrl, "SERR_INTR_ENABLE = %x\n", tempdword);
   1011	tempdword |= (GLOBAL_INTR_MASK  | GLOBAL_SERR_MASK |
   1012		      COMMAND_INTR_MASK | ARBITER_SERR_MASK);
   1013	tempdword &= ~SERR_INTR_RSVDZ_MASK;
   1014	shpc_writel(ctrl, SERR_INTR_ENABLE, tempdword);
   1015	tempdword = shpc_readl(ctrl, SERR_INTR_ENABLE);
   1016	ctrl_dbg(ctrl, "SERR_INTR_ENABLE = %x\n", tempdword);
   1017
   1018	/* Mask the MRL sensor SERR Mask of individual slot in
   1019	 * Slot SERR-INT Mask & clear all the existing event if any
   1020	 */
   1021	for (hp_slot = 0; hp_slot < ctrl->num_slots; hp_slot++) {
   1022		slot_reg = shpc_readl(ctrl, SLOT_REG(hp_slot));
   1023		ctrl_dbg(ctrl, "Default Logical Slot Register %d value %x\n",
   1024			 hp_slot, slot_reg);
   1025		slot_reg |= (PRSNT_CHANGE_INTR_MASK | ISO_PFAULT_INTR_MASK |
   1026			     BUTTON_PRESS_INTR_MASK | MRL_CHANGE_INTR_MASK |
   1027			     CON_PFAULT_INTR_MASK   | MRL_CHANGE_SERR_MASK |
   1028			     CON_PFAULT_SERR_MASK);
   1029		slot_reg &= ~SLOT_REG_RSVDZ_MASK;
   1030		shpc_writel(ctrl, SLOT_REG(hp_slot), slot_reg);
   1031	}
   1032
   1033	if (shpchp_poll_mode) {
   1034		/* Install interrupt polling timer. Start with 10 sec delay */
   1035		timer_setup(&ctrl->poll_timer, int_poll_timeout, 0);
   1036		start_int_poll_timer(ctrl, 10);
   1037	} else {
   1038		/* Installs the interrupt handler */
   1039		rc = pci_enable_msi(pdev);
   1040		if (rc) {
   1041			ctrl_info(ctrl, "Can't get msi for the hotplug controller\n");
   1042			ctrl_info(ctrl, "Use INTx for the hotplug controller\n");
   1043		} else {
   1044			pci_set_master(pdev);
   1045		}
   1046
   1047		rc = request_irq(ctrl->pci_dev->irq, shpc_isr, IRQF_SHARED,
   1048				 MY_NAME, (void *)ctrl);
   1049		ctrl_dbg(ctrl, "request_irq %d (returns %d)\n",
   1050			 ctrl->pci_dev->irq, rc);
   1051		if (rc) {
   1052			ctrl_err(ctrl, "Can't get irq %d for the hotplug controller\n",
   1053				 ctrl->pci_dev->irq);
   1054			goto abort_iounmap;
   1055		}
   1056	}
   1057	ctrl_dbg(ctrl, "HPC at %s irq=%x\n", pci_name(pdev), pdev->irq);
   1058
   1059	shpc_get_max_bus_speed(ctrl);
   1060	shpc_get_cur_bus_speed(ctrl);
   1061
   1062	/*
   1063	 * Unmask all event interrupts of all slots
   1064	 */
   1065	for (hp_slot = 0; hp_slot < ctrl->num_slots; hp_slot++) {
   1066		slot_reg = shpc_readl(ctrl, SLOT_REG(hp_slot));
   1067		ctrl_dbg(ctrl, "Default Logical Slot Register %d value %x\n",
   1068			 hp_slot, slot_reg);
   1069		slot_reg &= ~(PRSNT_CHANGE_INTR_MASK | ISO_PFAULT_INTR_MASK |
   1070			      BUTTON_PRESS_INTR_MASK | MRL_CHANGE_INTR_MASK |
   1071			      CON_PFAULT_INTR_MASK | SLOT_REG_RSVDZ_MASK);
   1072		shpc_writel(ctrl, SLOT_REG(hp_slot), slot_reg);
   1073	}
   1074	if (!shpchp_poll_mode) {
   1075		/* Unmask all general input interrupts and SERR */
   1076		tempdword = shpc_readl(ctrl, SERR_INTR_ENABLE);
   1077		tempdword &= ~(GLOBAL_INTR_MASK | COMMAND_INTR_MASK |
   1078			       SERR_INTR_RSVDZ_MASK);
   1079		shpc_writel(ctrl, SERR_INTR_ENABLE, tempdword);
   1080		tempdword = shpc_readl(ctrl, SERR_INTR_ENABLE);
   1081		ctrl_dbg(ctrl, "SERR_INTR_ENABLE = %x\n", tempdword);
   1082	}
   1083
   1084	return 0;
   1085
   1086	/* We end up here for the many possible ways to fail this API.  */
   1087abort_iounmap:
   1088	iounmap(ctrl->creg);
   1089abort:
   1090	return rc;
   1091}