1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * ddbridge-mci.c: Digital Devices microcode interface 4 * 5 * Copyright (C) 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-io.h" 21 #include "ddbridge-mci.h" 22 23 static LIST_HEAD(mci_list); 24 25 static const u32 MCLK = (1550000000 / 12); 26 static const u32 MAX_DEMOD_LDPC_BITRATE = (1550000000 / 6); 27 static const u32 MAX_LDPC_BITRATE = (720000000); 28 29 struct mci_base { 30 struct list_head mci_list; 31 void *key; 32 struct ddb_link *link; 33 struct completion completion; 34 35 struct device *dev; 36 struct mutex tuner_lock; /* concurrent tuner access lock */ 37 u8 adr; 38 struct mutex mci_lock; /* concurrent MCI access lock */ 39 int count; 40 41 u8 tuner_use_count[4]; 42 u8 assigned_demod[8]; 43 u32 used_ldpc_bitrate[8]; 44 u8 demod_in_use[8]; 45 u32 iq_mode; 46 }; 47 48 struct mci { 49 struct mci_base *base; 50 struct dvb_frontend fe; 51 int nr; 52 int demod; 53 int tuner; 54 int first_time_lock; 55 int started; 56 struct mci_result signal_info; 57 58 u32 bb_mode; 59 }; 60 61 static int mci_reset(struct mci *state) 62 { 63 struct ddb_link *link = state->base->link; 64 u32 status = 0; 65 u32 timeout = 40; 66 67 ddblwritel(link, MCI_CONTROL_RESET, MCI_CONTROL); 68 ddblwritel(link, 0, MCI_CONTROL + 4); /* 1= no internal init */ 69 msleep(300); 70 ddblwritel(link, 0, MCI_CONTROL); 71 72 while (1) { 73 status = ddblreadl(link, MCI_CONTROL); 74 if ((status & MCI_CONTROL_READY) == MCI_CONTROL_READY) 75 break; 76 if (--timeout == 0) 77 break; 78 msleep(50); 79 } 80 if ((status & MCI_CONTROL_READY) == 0) 81 return -1; 82 if (link->ids.device == 0x0009) 83 ddblwritel(link, SX8_TSCONFIG_MODE_NORMAL, SX8_TSCONFIG); 84 return 0; 85 } 86 87 static int mci_config(struct mci *state, u32 config) 88 { 89 struct ddb_link *link = state->base->link; 90 91 if (link->ids.device != 0x0009) 92 return -EINVAL; 93 ddblwritel(link, config, SX8_TSCONFIG); 94 return 0; 95 } 96 97 static int _mci_cmd_unlocked(struct mci *state, 98 u32 *cmd, u32 cmd_len, 99 u32 *res, u32 res_len) 100 { 101 struct ddb_link *link = state->base->link; 102 u32 i, val; 103 unsigned long stat; 104 105 val = ddblreadl(link, MCI_CONTROL); 106 if (val & (MCI_CONTROL_RESET | MCI_CONTROL_START_COMMAND)) 107 return -EIO; 108 if (cmd && cmd_len) 109 for (i = 0; i < cmd_len; i++) 110 ddblwritel(link, cmd[i], MCI_COMMAND + i * 4); 111 val |= (MCI_CONTROL_START_COMMAND | MCI_CONTROL_ENABLE_DONE_INTERRUPT); 112 ddblwritel(link, val, MCI_CONTROL); 113 114 stat = wait_for_completion_timeout(&state->base->completion, HZ); 115 if (stat == 0) { 116 dev_warn(state->base->dev, "MCI-%d: MCI timeout\n", state->nr); 117 return -EIO; 118 } 119 if (res && res_len) 120 for (i = 0; i < res_len; i++) 121 res[i] = ddblreadl(link, MCI_RESULT + i * 4); 122 return 0; 123 } 124 125 static int mci_cmd(struct mci *state, 126 struct mci_command *command, 127 struct mci_result *result) 128 { 129 int stat; 130 131 mutex_lock(&state->base->mci_lock); 132 stat = _mci_cmd_unlocked(state, 133 (u32 *)command, sizeof(*command) / sizeof(u32), 134 (u32 *)result, sizeof(*result) / sizeof(u32)); 135 mutex_unlock(&state->base->mci_lock); 136 return stat; 137 } 138 139 static void mci_handler(void *priv) 140 { 141 struct mci_base *base = (struct mci_base *)priv; 142 143 complete(&base->completion); 144 } 145 146 static void release(struct dvb_frontend *fe) 147 { 148 struct mci *state = fe->demodulator_priv; 149 150 state->base->count--; 151 if (state->base->count == 0) { 152 list_del(&state->base->mci_list); 153 kfree(state->base); 154 } 155 kfree(state); 156 } 157 158 static int read_status(struct dvb_frontend *fe, enum fe_status *status) 159 { 160 int stat; 161 struct mci *state = fe->demodulator_priv; 162 struct mci_command cmd; 163 struct mci_result res; 164 165 cmd.command = MCI_CMD_GETSTATUS; 166 cmd.demod = state->demod; 167 stat = mci_cmd(state, &cmd, &res); 168 if (stat) 169 return stat; 170 *status = 0x00; 171 if (res.status == SX8_DEMOD_WAIT_MATYPE) 172 *status = 0x0f; 173 if (res.status == SX8_DEMOD_LOCKED) 174 *status = 0x1f; 175 return stat; 176 } 177 178 static int mci_set_tuner(struct dvb_frontend *fe, u32 tuner, u32 on) 179 { 180 struct mci *state = fe->demodulator_priv; 181 struct mci_command cmd; 182 183 memset(&cmd, 0, sizeof(cmd)); 184 cmd.tuner = state->tuner; 185 cmd.command = on ? SX8_CMD_INPUT_ENABLE : SX8_CMD_INPUT_DISABLE; 186 return mci_cmd(state, &cmd, NULL); 187 } 188 189 static int stop(struct dvb_frontend *fe) 190 { 191 struct mci *state = fe->demodulator_priv; 192 struct mci_command cmd; 193 u32 input = state->tuner; 194 195 memset(&cmd, 0, sizeof(cmd)); 196 if (state->demod != 0xff) { 197 cmd.command = MCI_CMD_STOP; 198 cmd.demod = state->demod; 199 mci_cmd(state, &cmd, NULL); 200 if (state->base->iq_mode) { 201 cmd.command = MCI_CMD_STOP; 202 cmd.demod = state->demod; 203 cmd.output = 0; 204 mci_cmd(state, &cmd, NULL); 205 mci_config(state, SX8_TSCONFIG_MODE_NORMAL); 206 } 207 } 208 mutex_lock(&state->base->tuner_lock); 209 state->base->tuner_use_count[input]--; 210 if (!state->base->tuner_use_count[input]) 211 mci_set_tuner(fe, input, 0); 212 state->base->demod_in_use[state->demod] = 0; 213 state->base->used_ldpc_bitrate[state->nr] = 0; 214 state->demod = 0xff; 215 state->base->assigned_demod[state->nr] = 0xff; 216 state->base->iq_mode = 0; 217 mutex_unlock(&state->base->tuner_lock); 218 state->started = 0; 219 return 0; 220 } 221 222 static int start(struct dvb_frontend *fe, u32 flags, u32 modmask, u32 ts_config) 223 { 224 struct mci *state = fe->demodulator_priv; 225 struct dtv_frontend_properties *p = &fe->dtv_property_cache; 226 u32 used_ldpc_bitrate = 0, free_ldpc_bitrate; 227 u32 used_demods = 0; 228 struct mci_command cmd; 229 u32 input = state->tuner; 230 u32 bits_per_symbol = 0; 231 int i, stat = 0; 232 233 if (p->symbol_rate >= (MCLK / 2)) 234 flags &= ~1; 235 if ((flags & 3) == 0) 236 return -EINVAL; 237 238 if (flags & 2) { 239 u32 tmp = modmask; 240 241 bits_per_symbol = 1; 242 while (tmp & 1) { 243 tmp >>= 1; 244 bits_per_symbol++; 245 } 246 } 247 248 mutex_lock(&state->base->tuner_lock); 249 if (state->base->iq_mode) { 250 stat = -EBUSY; 251 goto unlock; 252 } 253 for (i = 0; i < 8; i++) { 254 used_ldpc_bitrate += state->base->used_ldpc_bitrate[i]; 255 if (state->base->demod_in_use[i]) 256 used_demods++; 257 } 258 if (used_ldpc_bitrate >= MAX_LDPC_BITRATE || 259 ((ts_config & SX8_TSCONFIG_MODE_MASK) > 260 SX8_TSCONFIG_MODE_NORMAL && used_demods > 0)) { 261 stat = -EBUSY; 262 goto unlock; 263 } 264 free_ldpc_bitrate = MAX_LDPC_BITRATE - used_ldpc_bitrate; 265 if (free_ldpc_bitrate > MAX_DEMOD_LDPC_BITRATE) 266 free_ldpc_bitrate = MAX_DEMOD_LDPC_BITRATE; 267 268 while (p->symbol_rate * bits_per_symbol > free_ldpc_bitrate) 269 bits_per_symbol--; 270 271 if (bits_per_symbol < 2) { 272 stat = -EBUSY; 273 goto unlock; 274 } 275 i = (p->symbol_rate > (MCLK / 2)) ? 3 : 7; 276 while (i >= 0 && state->base->demod_in_use[i]) 277 i--; 278 if (i < 0) { 279 stat = -EBUSY; 280 goto unlock; 281 } 282 state->base->demod_in_use[i] = 1; 283 state->base->used_ldpc_bitrate[state->nr] = p->symbol_rate 284 * bits_per_symbol; 285 state->demod = i; 286 state->base->assigned_demod[state->nr] = i; 287 288 if (!state->base->tuner_use_count[input]) 289 mci_set_tuner(fe, input, 1); 290 state->base->tuner_use_count[input]++; 291 state->base->iq_mode = (ts_config > 1); 292 unlock: 293 mutex_unlock(&state->base->tuner_lock); 294 if (stat) 295 return stat; 296 memset(&cmd, 0, sizeof(cmd)); 297 298 if (state->base->iq_mode) { 299 cmd.command = SX8_CMD_SELECT_IQOUT; 300 cmd.demod = state->demod; 301 cmd.output = 0; 302 mci_cmd(state, &cmd, NULL); 303 mci_config(state, ts_config); 304 } 305 if (p->stream_id != NO_STREAM_ID_FILTER && p->stream_id != 0x80000000) 306 flags |= 0x80; 307 dev_dbg(state->base->dev, "MCI-%d: tuner=%d demod=%d\n", 308 state->nr, state->tuner, state->demod); 309 cmd.command = MCI_CMD_SEARCH_DVBS; 310 cmd.dvbs2_search.flags = flags; 311 cmd.dvbs2_search.s2_modulation_mask = 312 modmask & ((1 << (bits_per_symbol - 1)) - 1); 313 cmd.dvbs2_search.retry = 2; 314 cmd.dvbs2_search.frequency = p->frequency * 1000; 315 cmd.dvbs2_search.symbol_rate = p->symbol_rate; 316 cmd.dvbs2_search.scrambling_sequence_index = 317 p->scrambling_sequence_index; 318 cmd.dvbs2_search.input_stream_id = 319 (p->stream_id != NO_STREAM_ID_FILTER) ? p->stream_id : 0; 320 cmd.tuner = state->tuner; 321 cmd.demod = state->demod; 322 cmd.output = state->nr; 323 if (p->stream_id == 0x80000000) 324 cmd.output |= 0x80; 325 stat = mci_cmd(state, &cmd, NULL); 326 if (stat) 327 stop(fe); 328 return stat; 329 } 330 331 static int start_iq(struct dvb_frontend *fe, u32 ts_config) 332 { 333 struct mci *state = fe->demodulator_priv; 334 struct dtv_frontend_properties *p = &fe->dtv_property_cache; 335 u32 used_demods = 0; 336 struct mci_command cmd; 337 u32 input = state->tuner; 338 int i, stat = 0; 339 340 mutex_lock(&state->base->tuner_lock); 341 if (state->base->iq_mode) { 342 stat = -EBUSY; 343 goto unlock; 344 } 345 for (i = 0; i < 8; i++) 346 if (state->base->demod_in_use[i]) 347 used_demods++; 348 if (used_demods > 0) { 349 stat = -EBUSY; 350 goto unlock; 351 } 352 state->demod = 0; 353 state->base->assigned_demod[state->nr] = 0; 354 if (!state->base->tuner_use_count[input]) 355 mci_set_tuner(fe, input, 1); 356 state->base->tuner_use_count[input]++; 357 state->base->iq_mode = (ts_config > 1); 358 unlock: 359 mutex_unlock(&state->base->tuner_lock); 360 if (stat) 361 return stat; 362 363 memset(&cmd, 0, sizeof(cmd)); 364 cmd.command = SX8_CMD_START_IQ; 365 cmd.dvbs2_search.frequency = p->frequency * 1000; 366 cmd.dvbs2_search.symbol_rate = p->symbol_rate; 367 cmd.tuner = state->tuner; 368 cmd.demod = state->demod; 369 cmd.output = 7; 370 mci_config(state, ts_config); 371 stat = mci_cmd(state, &cmd, NULL); 372 if (stat) 373 stop(fe); 374 return stat; 375 } 376 377 static int set_parameters(struct dvb_frontend *fe) 378 { 379 int stat = 0; 380 struct mci *state = fe->demodulator_priv; 381 struct dtv_frontend_properties *p = &fe->dtv_property_cache; 382 u32 ts_config, iq_mode = 0, isi; 383 384 if (state->started) 385 stop(fe); 386 387 isi = p->stream_id; 388 if (isi != NO_STREAM_ID_FILTER) 389 iq_mode = (isi & 0x30000000) >> 28; 390 391 switch (iq_mode) { 392 case 1: 393 ts_config = (SX8_TSCONFIG_TSHEADER | SX8_TSCONFIG_MODE_IQ); 394 break; 395 case 2: 396 ts_config = (SX8_TSCONFIG_TSHEADER | SX8_TSCONFIG_MODE_IQ); 397 break; 398 default: 399 ts_config = SX8_TSCONFIG_MODE_NORMAL; 400 break; 401 } 402 403 if (iq_mode != 2) { 404 u32 flags = 3; 405 u32 mask = 3; 406 407 if (p->modulation == APSK_16 || 408 p->modulation == APSK_32) { 409 flags = 2; 410 mask = 15; 411 } 412 stat = start(fe, flags, mask, ts_config); 413 } else { 414 stat = start_iq(fe, ts_config); 415 } 416 417 if (!stat) { 418 state->started = 1; 419 state->first_time_lock = 1; 420 state->signal_info.status = SX8_DEMOD_WAIT_SIGNAL; 421 } 422 423 return stat; 424 } 425 426 static int tune(struct dvb_frontend *fe, bool re_tune, 427 unsigned int mode_flags, 428 unsigned int *delay, enum fe_status *status) 429 { 430 int r; 431 432 if (re_tune) { 433 r = set_parameters(fe); 434 if (r) 435 return r; 436 } 437 r = read_status(fe, status); 438 if (r) 439 return r; 440 441 if (*status & FE_HAS_LOCK) 442 return 0; 443 *delay = HZ / 10; 444 return 0; 445 } 446 447 static enum dvbfe_algo get_algo(struct dvb_frontend *fe) 448 { 449 return DVBFE_ALGO_HW; 450 } 451 452 static int set_input(struct dvb_frontend *fe, int input) 453 { 454 struct mci *state = fe->demodulator_priv; 455 456 state->tuner = input; 457 dev_dbg(state->base->dev, "MCI-%d: input=%d\n", state->nr, input); 458 return 0; 459 } 460 461 static struct dvb_frontend_ops mci_ops = { 462 .delsys = { SYS_DVBS, SYS_DVBS2 }, 463 .info = { 464 .name = "Digital Devices MaxSX8 MCI DVB-S/S2/S2X", 465 .frequency_min = 950000, 466 .frequency_max = 2150000, 467 .frequency_stepsize = 0, 468 .frequency_tolerance = 0, 469 .symbol_rate_min = 100000, 470 .symbol_rate_max = 100000000, 471 .caps = FE_CAN_INVERSION_AUTO | 472 FE_CAN_FEC_AUTO | 473 FE_CAN_QPSK | 474 FE_CAN_2G_MODULATION | 475 FE_CAN_MULTISTREAM, 476 }, 477 .get_frontend_algo = get_algo, 478 .tune = tune, 479 .release = release, 480 .read_status = read_status, 481 }; 482 483 static struct mci_base *match_base(void *key) 484 { 485 struct mci_base *p; 486 487 list_for_each_entry(p, &mci_list, mci_list) 488 if (p->key == key) 489 return p; 490 return NULL; 491 } 492 493 static int probe(struct mci *state) 494 { 495 mci_reset(state); 496 return 0; 497 } 498 499 struct dvb_frontend 500 *ddb_mci_attach(struct ddb_input *input, 501 int mci_type, int nr, 502 int (**fn_set_input)(struct dvb_frontend *, int)) 503 { 504 struct ddb_port *port = input->port; 505 struct ddb *dev = port->dev; 506 struct ddb_link *link = &dev->link[port->lnr]; 507 struct mci_base *base; 508 struct mci *state; 509 void *key = mci_type ? (void *)port : (void *)link; 510 511 state = kzalloc(sizeof(*state), GFP_KERNEL); 512 if (!state) 513 return NULL; 514 515 base = match_base(key); 516 if (base) { 517 base->count++; 518 state->base = base; 519 } else { 520 base = kzalloc(sizeof(*base), GFP_KERNEL); 521 if (!base) 522 goto fail; 523 base->key = key; 524 base->count = 1; 525 base->link = link; 526 base->dev = dev->dev; 527 mutex_init(&base->mci_lock); 528 mutex_init(&base->tuner_lock); 529 ddb_irq_set(dev, link->nr, 0, mci_handler, base); 530 init_completion(&base->completion); 531 state->base = base; 532 if (probe(state) < 0) { 533 kfree(base); 534 goto fail; 535 } 536 list_add(&base->mci_list, &mci_list); 537 } 538 state->fe.ops = mci_ops; 539 state->fe.demodulator_priv = state; 540 state->nr = nr; 541 *fn_set_input = set_input; 542 543 state->tuner = nr; 544 state->demod = nr; 545 546 return &state->fe; 547 fail: 548 kfree(state); 549 return NULL; 550 } 551