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

ddbridge-hw.c (9972B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * ddbridge-hw.c: Digital Devices bridge hardware maps
      4 *
      5 * Copyright (C) 2010-2017 Digital Devices GmbH
      6 *                         Ralph Metzler <rjkm@metzlerbros.de>
      7 *                         Marcus Metzler <mocm@metzlerbros.de>
      8 *
      9 * This program is free software; you can redistribute it and/or
     10 * modify it under the terms of the GNU General Public License
     11 * version 2 only, as published by the Free Software Foundation.
     12 *
     13 * This program is distributed in the hope that it will be useful,
     14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16 * GNU General Public License for more details.
     17 */
     18
     19#include "ddbridge.h"
     20#include "ddbridge-hw.h"
     21
     22/******************************************************************************/
     23
     24static const struct ddb_regset octopus_input = {
     25	.base = 0x200,
     26	.num  = 0x08,
     27	.size = 0x10,
     28};
     29
     30static const struct ddb_regset octopus_output = {
     31	.base = 0x280,
     32	.num  = 0x08,
     33	.size = 0x10,
     34};
     35
     36static const struct ddb_regset octopus_idma = {
     37	.base = 0x300,
     38	.num  = 0x08,
     39	.size = 0x10,
     40};
     41
     42static const struct ddb_regset octopus_idma_buf = {
     43	.base = 0x2000,
     44	.num  = 0x08,
     45	.size = 0x100,
     46};
     47
     48static const struct ddb_regset octopus_odma = {
     49	.base = 0x380,
     50	.num  = 0x04,
     51	.size = 0x10,
     52};
     53
     54static const struct ddb_regset octopus_odma_buf = {
     55	.base = 0x2800,
     56	.num  = 0x04,
     57	.size = 0x100,
     58};
     59
     60static const struct ddb_regset octopus_i2c = {
     61	.base = 0x80,
     62	.num  = 0x04,
     63	.size = 0x20,
     64};
     65
     66static const struct ddb_regset octopus_i2c_buf = {
     67	.base = 0x1000,
     68	.num  = 0x04,
     69	.size = 0x200,
     70};
     71
     72/****************************************************************************/
     73
     74static const struct ddb_regmap octopus_map = {
     75	.irq_base_i2c = 0,
     76	.irq_base_idma = 8,
     77	.irq_base_odma = 16,
     78	.i2c = &octopus_i2c,
     79	.i2c_buf = &octopus_i2c_buf,
     80	.idma = &octopus_idma,
     81	.idma_buf = &octopus_idma_buf,
     82	.odma = &octopus_odma,
     83	.odma_buf = &octopus_odma_buf,
     84	.input = &octopus_input,
     85	.output = &octopus_output,
     86};
     87
     88/****************************************************************************/
     89
     90static const struct ddb_info ddb_none = {
     91	.type     = DDB_NONE,
     92	.name     = "unknown Digital Devices PCIe card, install newer driver",
     93	.regmap   = &octopus_map,
     94};
     95
     96static const struct ddb_info ddb_octopus = {
     97	.type     = DDB_OCTOPUS,
     98	.name     = "Digital Devices Octopus DVB adapter",
     99	.regmap   = &octopus_map,
    100	.port_num = 4,
    101	.i2c_mask = 0x0f,
    102};
    103
    104static const struct ddb_info ddb_octopusv3 = {
    105	.type     = DDB_OCTOPUS,
    106	.name     = "Digital Devices Octopus V3 DVB adapter",
    107	.regmap   = &octopus_map,
    108	.port_num = 4,
    109	.i2c_mask = 0x0f,
    110};
    111
    112static const struct ddb_info ddb_octopus_le = {
    113	.type     = DDB_OCTOPUS,
    114	.name     = "Digital Devices Octopus LE DVB adapter",
    115	.regmap   = &octopus_map,
    116	.port_num = 2,
    117	.i2c_mask = 0x03,
    118};
    119
    120static const struct ddb_info ddb_octopus_oem = {
    121	.type     = DDB_OCTOPUS,
    122	.name     = "Digital Devices Octopus OEM",
    123	.regmap   = &octopus_map,
    124	.port_num = 4,
    125	.i2c_mask = 0x0f,
    126	.led_num  = 1,
    127	.fan_num  = 1,
    128	.temp_num = 1,
    129	.temp_bus = 0,
    130};
    131
    132static const struct ddb_info ddb_octopus_mini = {
    133	.type     = DDB_OCTOPUS,
    134	.name     = "Digital Devices Octopus Mini",
    135	.regmap   = &octopus_map,
    136	.port_num = 4,
    137	.i2c_mask = 0x0f,
    138};
    139
    140static const struct ddb_info ddb_v6 = {
    141	.type     = DDB_OCTOPUS,
    142	.name     = "Digital Devices Cine S2 V6 DVB adapter",
    143	.regmap   = &octopus_map,
    144	.port_num = 3,
    145	.i2c_mask = 0x07,
    146};
    147
    148static const struct ddb_info ddb_v6_5 = {
    149	.type     = DDB_OCTOPUS,
    150	.name     = "Digital Devices Cine S2 V6.5 DVB adapter",
    151	.regmap   = &octopus_map,
    152	.port_num = 4,
    153	.i2c_mask = 0x0f,
    154};
    155
    156static const struct ddb_info ddb_v7 = {
    157	.type     = DDB_OCTOPUS,
    158	.name     = "Digital Devices Cine S2 V7 DVB adapter",
    159	.regmap   = &octopus_map,
    160	.port_num = 4,
    161	.i2c_mask = 0x0f,
    162	.board_control   = 2,
    163	.board_control_2 = 4,
    164	.ts_quirks = TS_QUIRK_REVERSED,
    165};
    166
    167static const struct ddb_info ddb_v7a = {
    168	.type     = DDB_OCTOPUS,
    169	.name     = "Digital Devices Cine S2 V7 Advanced DVB adapter",
    170	.regmap   = &octopus_map,
    171	.port_num = 4,
    172	.i2c_mask = 0x0f,
    173	.board_control   = 2,
    174	.board_control_2 = 4,
    175	.ts_quirks = TS_QUIRK_REVERSED,
    176};
    177
    178static const struct ddb_info ddb_ctv7 = {
    179	.type     = DDB_OCTOPUS,
    180	.name     = "Digital Devices Cine CT V7 DVB adapter",
    181	.regmap   = &octopus_map,
    182	.port_num = 4,
    183	.i2c_mask = 0x0f,
    184	.board_control   = 3,
    185	.board_control_2 = 4,
    186};
    187
    188static const struct ddb_info ddb_satixs2v3 = {
    189	.type     = DDB_OCTOPUS,
    190	.name     = "Mystique SaTiX-S2 V3 DVB adapter",
    191	.regmap   = &octopus_map,
    192	.port_num = 3,
    193	.i2c_mask = 0x07,
    194};
    195
    196static const struct ddb_info ddb_ci = {
    197	.type     = DDB_OCTOPUS_CI,
    198	.name     = "Digital Devices Octopus CI",
    199	.regmap   = &octopus_map,
    200	.port_num = 4,
    201	.i2c_mask = 0x03,
    202};
    203
    204static const struct ddb_info ddb_cis = {
    205	.type     = DDB_OCTOPUS_CI,
    206	.name     = "Digital Devices Octopus CI single",
    207	.regmap   = &octopus_map,
    208	.port_num = 3,
    209	.i2c_mask = 0x03,
    210};
    211
    212static const struct ddb_info ddb_ci_s2_pro = {
    213	.type     = DDB_OCTOPUS_CI,
    214	.name     = "Digital Devices Octopus CI S2 Pro",
    215	.regmap   = &octopus_map,
    216	.port_num = 4,
    217	.i2c_mask = 0x01,
    218	.board_control   = 2,
    219	.board_control_2 = 4,
    220};
    221
    222static const struct ddb_info ddb_ci_s2_pro_a = {
    223	.type     = DDB_OCTOPUS_CI,
    224	.name     = "Digital Devices Octopus CI S2 Pro Advanced",
    225	.regmap   = &octopus_map,
    226	.port_num = 4,
    227	.i2c_mask = 0x01,
    228	.board_control   = 2,
    229	.board_control_2 = 4,
    230};
    231
    232static const struct ddb_info ddb_dvbct = {
    233	.type     = DDB_OCTOPUS,
    234	.name     = "Digital Devices DVBCT V6.1 DVB adapter",
    235	.regmap   = &octopus_map,
    236	.port_num = 3,
    237	.i2c_mask = 0x07,
    238};
    239
    240/****************************************************************************/
    241
    242static const struct ddb_info ddb_ct2_8 = {
    243	.type     = DDB_OCTOPUS_MAX_CT,
    244	.name     = "Digital Devices MAX A8 CT2",
    245	.regmap   = &octopus_map,
    246	.port_num = 4,
    247	.i2c_mask = 0x0f,
    248	.board_control   = 0x0ff,
    249	.board_control_2 = 0xf00,
    250	.ts_quirks = TS_QUIRK_SERIAL,
    251	.tempmon_irq = 24,
    252};
    253
    254static const struct ddb_info ddb_c2t2_8 = {
    255	.type     = DDB_OCTOPUS_MAX_CT,
    256	.name     = "Digital Devices MAX A8 C2T2",
    257	.regmap   = &octopus_map,
    258	.port_num = 4,
    259	.i2c_mask = 0x0f,
    260	.board_control   = 0x0ff,
    261	.board_control_2 = 0xf00,
    262	.ts_quirks = TS_QUIRK_SERIAL,
    263	.tempmon_irq = 24,
    264};
    265
    266static const struct ddb_info ddb_isdbt_8 = {
    267	.type     = DDB_OCTOPUS_MAX_CT,
    268	.name     = "Digital Devices MAX A8 ISDBT",
    269	.regmap   = &octopus_map,
    270	.port_num = 4,
    271	.i2c_mask = 0x0f,
    272	.board_control   = 0x0ff,
    273	.board_control_2 = 0xf00,
    274	.ts_quirks = TS_QUIRK_SERIAL,
    275	.tempmon_irq = 24,
    276};
    277
    278static const struct ddb_info ddb_c2t2i_v0_8 = {
    279	.type     = DDB_OCTOPUS_MAX_CT,
    280	.name     = "Digital Devices MAX A8 C2T2I V0",
    281	.regmap   = &octopus_map,
    282	.port_num = 4,
    283	.i2c_mask = 0x0f,
    284	.board_control   = 0x0ff,
    285	.board_control_2 = 0xf00,
    286	.ts_quirks = TS_QUIRK_SERIAL | TS_QUIRK_ALT_OSC,
    287	.tempmon_irq = 24,
    288};
    289
    290static const struct ddb_info ddb_c2t2i_8 = {
    291	.type     = DDB_OCTOPUS_MAX_CT,
    292	.name     = "Digital Devices MAX A8 C2T2I",
    293	.regmap   = &octopus_map,
    294	.port_num = 4,
    295	.i2c_mask = 0x0f,
    296	.board_control   = 0x0ff,
    297	.board_control_2 = 0xf00,
    298	.ts_quirks = TS_QUIRK_SERIAL,
    299	.tempmon_irq = 24,
    300};
    301
    302/****************************************************************************/
    303
    304static const struct ddb_info ddb_s2_48 = {
    305	.type     = DDB_OCTOPUS_MAX,
    306	.name     = "Digital Devices MAX S8 4/8",
    307	.regmap   = &octopus_map,
    308	.port_num = 4,
    309	.i2c_mask = 0x01,
    310	.board_control = 1,
    311	.tempmon_irq = 24,
    312};
    313
    314static const struct ddb_info ddb_s2x_48 = {
    315	.type     = DDB_OCTOPUS_MCI,
    316	.name     = "Digital Devices MAX SX8",
    317	.regmap   = &octopus_map,
    318	.port_num = 4,
    319	.i2c_mask = 0x00,
    320	.tempmon_irq = 24,
    321	.mci_ports = 4,
    322	.mci_type = 0,
    323};
    324
    325/****************************************************************************/
    326/****************************************************************************/
    327/****************************************************************************/
    328
    329#define DDB_DEVID(_device, _subdevice, _info) { \
    330	.vendor = DDVID, \
    331	.device = _device, \
    332	.subvendor = DDVID, \
    333	.subdevice = _subdevice, \
    334	.info = &_info }
    335
    336static const struct ddb_device_id ddb_device_ids[] = {
    337	/* PCIe devices */
    338	DDB_DEVID(0x0002, 0x0001, ddb_octopus),
    339	DDB_DEVID(0x0003, 0x0001, ddb_octopus),
    340	DDB_DEVID(0x0005, 0x0004, ddb_octopusv3),
    341	DDB_DEVID(0x0003, 0x0002, ddb_octopus_le),
    342	DDB_DEVID(0x0003, 0x0003, ddb_octopus_oem),
    343	DDB_DEVID(0x0003, 0x0010, ddb_octopus_mini),
    344	DDB_DEVID(0x0005, 0x0011, ddb_octopus_mini),
    345	DDB_DEVID(0x0003, 0x0020, ddb_v6),
    346	DDB_DEVID(0x0003, 0x0021, ddb_v6_5),
    347	DDB_DEVID(0x0006, 0x0022, ddb_v7),
    348	DDB_DEVID(0x0006, 0x0024, ddb_v7a),
    349	DDB_DEVID(0x0003, 0x0030, ddb_dvbct),
    350	DDB_DEVID(0x0003, 0xdb03, ddb_satixs2v3),
    351	DDB_DEVID(0x0006, 0x0031, ddb_ctv7),
    352	DDB_DEVID(0x0006, 0x0032, ddb_ctv7),
    353	DDB_DEVID(0x0006, 0x0033, ddb_ctv7),
    354	DDB_DEVID(0x0007, 0x0023, ddb_s2_48),
    355	DDB_DEVID(0x0008, 0x0034, ddb_ct2_8),
    356	DDB_DEVID(0x0008, 0x0035, ddb_c2t2_8),
    357	DDB_DEVID(0x0008, 0x0036, ddb_isdbt_8),
    358	DDB_DEVID(0x0008, 0x0037, ddb_c2t2i_v0_8),
    359	DDB_DEVID(0x0008, 0x0038, ddb_c2t2i_8),
    360	DDB_DEVID(0x0009, 0x0025, ddb_s2x_48),
    361	DDB_DEVID(0x0006, 0x0039, ddb_ctv7),
    362	DDB_DEVID(0x0011, 0x0040, ddb_ci),
    363	DDB_DEVID(0x0011, 0x0041, ddb_cis),
    364	DDB_DEVID(0x0012, 0x0042, ddb_ci),
    365	DDB_DEVID(0x0013, 0x0043, ddb_ci_s2_pro),
    366	DDB_DEVID(0x0013, 0x0044, ddb_ci_s2_pro_a),
    367};
    368
    369/****************************************************************************/
    370
    371const struct ddb_info *get_ddb_info(u16 vendor, u16 device,
    372				    u16 subvendor, u16 subdevice)
    373{
    374	int i;
    375
    376	for (i = 0; i < ARRAY_SIZE(ddb_device_ids); i++) {
    377		const struct ddb_device_id *id = &ddb_device_ids[i];
    378
    379		if (vendor == id->vendor &&
    380		    device == id->device &&
    381		    subvendor == id->subvendor &&
    382		    (subdevice == id->subdevice ||
    383		     id->subdevice == 0xffff))
    384			return id->info;
    385	}
    386
    387	return &ddb_none;
    388}